Dependency injection 为什么会有';Google Guice的依赖项注入根本没有配置文件?

Dependency injection 为什么会有';Google Guice的依赖项注入根本没有配置文件?,dependency-injection,configuration-files,guice,Dependency Injection,Configuration Files,Guice,我正在结账,但我有点困惑:为什么根本没有配置文件 我在上找到了部分解释,但仍然不清楚如何在没有配置文件的情况下设置组件角色(或需要使用交换机的任何其他东西) 感谢您的帮助 配置在代码中,而不是在配置文件中,这对于许多场景都是有效的决策 是的,这意味着如果您想发布一种不同的应用程序管道方式,您必须重新构建(可能只是模块)——当然,如果您愿意,您仍然可以从命令行参数、属性文件等获取一些配置值 如果您经常需要更改应用程序管道,并且除了一个文件之外不想重新部署任何东西,那么Guice可能不适合您。另一方

我正在结账,但我有点困惑:为什么根本没有配置文件

我在上找到了部分解释,但仍然不清楚如何在没有配置文件的情况下设置组件角色(或需要使用交换机的任何其他东西)


感谢您的帮助

配置在代码中,而不是在配置文件中,这对于许多场景都是有效的决策

是的,这意味着如果您想发布一种不同的应用程序管道方式,您必须重新构建(可能只是模块)——当然,如果您愿意,您仍然可以从命令行参数、属性文件等获取一些配置值

如果您经常需要更改应用程序管道,并且除了一个文件之外不想重新部署任何东西,那么Guice可能不适合您。另一方面,如果您使用DI的主要原因是为了使代码更清晰,并且在生产中您总是使用相同的管道(或足够接近),那么Guice是一个很好的选择-在整理管道时,通常需要使用一些逻辑,以及通常难以以声明方式描述/构造的组件


不同的DI框架有不同的优点和权衡——使用最适合您的应用程序的框架。

GUI中的许多配置都是通过@Inject注释隐式进行的。项目中的大量复杂性来自大量的项目工件。Java文件、Xml文件、属性文件、数据库、参数。。Guice试图通过不使用配置文件来消除这种复杂性的一部分


在编译时重新连接应用程序很容易。您很可能只需要编辑模块类。对于Guice处理的大多数类,您根本不需要配置,但是只有@Inject在正确的位置-只有当您有两个相同接口的不同实现时,或者当您希望使用提供程序类从外部库注入类时,您才需要配置任何东西。

大多数DI配置在一个部署到另一个部署时都是相同的,因此,它们可以很好地使用代码进行配置,这使得Guice的配置非常简洁,并且您可以获得编译时类型检查、重构工具、代码导航等好处


对于从部署到另一个部署的一些更改,例如数据库用户名和密码配置,您可以自己编写所需的代码。编写代码,读取配置文件(可能是属性文件),解析参数,并将它们绑定到GUI模块中,以便应用程序能够访问它们。执行此操作所需的代码不会占用很多行代码。

不确定文件是什么意思,但Guice允许您通过和自定义更改实现。

如果您愿意,使用配置文件引入boostapping是很简单的。我们将Guice与一个简单的API结合使用,该API加载真正需要参数化的属性文件。这可以与@Named注释等一起使用,当然,您可以在模块中使用一些条件(尽管最好不要过度使用)

这是一个如何设置部分引导的示例:

public class MetModules extends AbstractModule {

    private static final Logger log = LoggerFactory.getLogger(MetModules.class);

    private final Settings settings;

    public MetModules(Settings settings) {
        this.settings = settings;
    }

    @Override
    protected void configure() {

        // common (stage independent modules) go here
        install(new CommandsModule());
        install(new ServletsModule());
        install(new DataBaseModule(settings));
        install(new JobsModule(settings));

        // any development/ production specific modules
        Stage stage = currentStage();
        if (Stage.DEVELOPMENT.equals(stage)) {
            configureForDevelopment();
        } else { // PRODUCTION
            configureForProduction();
        }
    }

    /**
     * Install modules that will be used in development.
     */
    private void configureForDevelopment() {

        // Mock implementation of email delivery that just logs it got a
        // message rather than trying to send it.
        install(new AbstractModule() {
            @Override
            protected void configure() {
                bind(Delivery.class).toInstance(new Delivery() {

                    public String deliver(MailMessageExchange exchange)
                            throws DeliveryException {
                        log.info("email message: "
                                + exchange.getMessage().getMailMessage()
                                + " to "
                                + Arrays.asList(exchange.getMessage()
                                        .getMailMessage().getTo())
                                + " (not sent)");
                        return "fooMessageId";
                    }
                });
            }
        });

        // local in-memory registry suffices
        install(new LocalServiceRegistryModule());

        // local in memory db implementations of services
        install(new LocalServicesModule());
    }

    /**
     * Install modules that will be used in production.
     */
    private void configureForProduction() {
        // we really only need this (error interception and audit logging)
        // in production
        install(new AopModule());
        install(new ZooKeeperServiceRegistryModule());      }
}

其中设置是读取我们的属性文件等的内容。目前,开发/生产以及特定于部署的特定设置似乎为我们完成了这项工作,但如果我们愿意的话,我们可以更进一步。

我最近创建了以下项目


它是WIP,但允许运行时根据环境从属性文件中注入属性。

是的-我的意思是改变行为的唯一方法是重建整个过程