我正在检查Google Guice作为DI框架,但我有点疑惑:为什么根本没有配置文件?
我找到了关于这个问题的部分解释,但是如果没有配置文件我仍然不清楚如何设置我的组件角色(或者我需要使用交换机的任何其他东西).
任何帮助赞赏!
配置在代码中而不是配置文件中,这是许多方案的有效决策.
是的,这意味着如果你想要发布一种不同的应用程序管道方式,你必须重建(可能只是模块) - 当然你仍然可以从命令行参数,属性文件等获得一些配置值,如果你想至.
如果您经常需要更改应用程序管道并且不想重新部署除单个文件之外的任何内容,则Guice可能不适合您.另一方面,如果你使用DI的主要原因是让你的代码更清晰,而且在生产中你总是真的使用相同的管道(或足够接近),那么Guice是一个不错的选择 - 你经常需要一些逻辑无论如何在整理管道时使用,以及通常难以以声明方式描述/构造的组件.
不同的DI框架有不同的好处和权衡 - 使用最适合您的应用程序.
如果您愿意,使用配置文件引入boostrapping是微不足道的.我们将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()); } }
设置是什么读取我们的属性文件等.现在开发/生产以及特定于部署的特定设置覆盖似乎为我们做了工作,但如果我们想要显而易见,我们可以更进一步.
从一个部署到另一个部署,大多数DI配置都是相同的,因此可以使用代码很好地配置它们,这使得Guice的配置非常简洁,并且您可以获得编译时类型检查,重构工具,代码导航等的好处.
对于从部署到另一个更改的少数事情,例如数据库用户名和密码配置,您可以自己编写所需的代码.编写读取配置文件(可能是属性文件)的代码,解析参数,并在Guice模块中绑定它们,以便应用程序可以访问它们.这样做所需的代码不需要多行代码.