DropWizard的Bootstrap、Configuration和Environment之间有什么区别?

29

一个典型的DropWizard应用程序指定一个Application子类,并重写它的initialize方法,如下所示:

一个典型的 DropWizard 应用会指定一个 Application 子类,并覆盖其 initialize 方法,例如:

class MyApplication extends Application<MyConfiguration> {
    static void main(String[] args) {
        new MyApplication().run(args)
    }

    @Override
    public void initialize(Bootstrap<MyConfiguration> bootstrap) {
        // ???
    }

    @Override
    public void run(MyConfiguration configuration, Environment environment)
            throws Exception {
        // Register resources, health checks, etc.
    }
}

阅读过DropWizard文档以及以下JavaDocs:

  • Configuration - YAML配置文件的对象表示。可以通过扩展此类添加自己的配置属性,它们将从YAML文件中解析。
  • Bootstrap - 预启动应用程序环境,包含启动Dropwizard命令所需的所有内容。
  • Environment - Dropwizard 应用程序的运行环境。

但这些类的定义相当模糊,特别是后面两个。我理解应该定义Configuration的子类,并且它表示我的应用程序的YAML/JSON配置文件的内存POJO。

但我无法理解其他构造函数代表的意义(BootstrapEnvironment) 。我习惯将特定于环境的配置注入到我的应用程序中,因此我倾向于将“环境”和“配置”的概念视为相同的。

此外,似乎DropWizard紧密耦合了Bootstrap实例和Configuration实现实例,但我找不到任何可证明这两个类差异的示例,并且它们应该如何彼此不同地使用。

所以我问:

  1. Bootstrap是什么,我用它做什么?
  2. Environment是什么,我用它做什么?
1个回答

16

Dropwizard基本上是一个有主见的Web框架,主要用于作为REST API项目。你所询问的类是什么构成了Dropwizard应用程序的核心。开发人员将他们想要在框架中使用的所有库组合在一起,并将它们连接在一起,以便我们可以轻松地使用他们已经为我们启动的内容。

Environment 是Dropwizard环境容器,而不是您的应用程序个人环境(例如本地与生产环境)。它具有对Dropwizard框架至关重要的属性,例如Jersey Web容器。

Bootstrap 基本上是将Environment中使用的所有东西(包括Configuration和Application)连接起来的类。

如果您查看源文件,您将会了解这些类如何工作。

更新: 根据您下面的问题,Environment不应用于确定数据库连接类型和凭据;那就是您的Configuration .yml文件的任务。您将希望在该文件中放置任何特定于环境的变量,然后使用特定的.yml文件运行应用程序。我个人有一个application-local.yml,application-staging.yml和application-prod.yml,并根据环境使用适当的.yml运行我的应用程序。

Dropwizard使用特定的.yml属性自动配置数据源,详见这里


感谢 @th3morg (+1) - 我猜开始有点明白了,我一定会查看源代码来进一步挖掘。有一个跟进问题关于 Environment:比如说,用于确定我们正在运行 Jersey/Jetty 的“dev”版本,因此我们应该使用内存嵌入式数据库,而不是容器的“prod”版本,因此应该使用我们的实际 MySQL 服务器吗?如果不是,你能给出 Environment 的几个具体用例吗?再次感谢! - IAmYourFaja
1
@IAmYourFaja 我还建议在IDE中以调试模式运行应用程序,您可以通过Bootstrap和Environment类暂停和/或逐步执行。这样,您很快就能了解所有在幕后完成的配置工作 :) - th3morg
谢谢@th3morg (+1) - 但我在Windows上,没有IDE的访问权限,我只是使用普通的Notepad。 - IAmYourFaja
7
我不明白为什么 Bootstrap 类要带有 Configuration 参数,但在准备初始化包时无法访问它(我倾向于在 initialize() 方法中使用 Guice 来注入依赖项到包中,并需要在那里访问配置)。 - macromaniac
是的,在Application.initialize方法中访问config对象会非常好。我也使用Guice。 - Dmitry Polyakovsky
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接