我的任务是将我自己在 Waffle 框架中使用 PicoContainer 作为 DI 机制开发的应用程序转换为我们的新“堆栈”,即使用 Struts2 作为框架,Guice 作为 DI 机制。关于如何以最小的痛苦做到这一点,同时从新框架和 DI 机制中获得最佳效果,有没有人有任何有用的指示?
提前谢谢了。
我的任务是将我自己在 Waffle 框架中使用 PicoContainer 作为 DI 机制开发的应用程序转换为我们的新“堆栈”,即使用 Struts2 作为框架,Guice 作为 DI 机制。关于如何以最小的痛苦做到这一点,同时从新框架和 DI 机制中获得最佳效果,有没有人有任何有用的指示?
提前谢谢了。
是的,我意识到这个问题有点含糊,但我最终还是完成了。DI 的 Waffle/Pico 机制利用一个名为 Registrar 的类来设置您想要注入的类及其在 webapp 中的范围。他们网站上的示例是:
public class MyRegistrar extends AbstractRegistrar {
public MyRegistrar(Registrar delegate) {
super(delegate);
}
public void application() {
register("helloworld", HelloWorldController.class);
}
}
此示例显示了一个应用程序范围的类 - 对于会话和请求范围,您只需将它们放在相关的session()
或request()
方法中。
使用 Struts2 和 Guice,事情的结构略有不同。@Inject
首先以 Guice 为例,它使用构造函数上方的注解注入依赖项。注入配置是通过名为 Modules 的类完成的,它必须重写一个调用的方法configure()
才能将接口绑定到它们的类 - Google 的示例如下所示。
public class BillingModule extends AbstractModule {
@Override
protected void configure() {
bind(TransactionLog.class).to(DatabaseTransactionLog.class);
bind(CreditCardProcessor.class).to(PaypalCreditCardProcessor.class);
bind(BillingService.class).to(RealBillingService.class);
}
}
范围也在这些模块中配置。Singleton 实际上是一个应用程序范围的类,可以这样指定:
bind(TransactionLog.class).to(InMemoryTransactionLog.class).in(Singleton.class);
但是 Guice 也有SessionScoped.class
,RequestScoped.class
所以过渡是相当微不足道的。
关于 Struts2,那里使用的依赖注入实际上是最终成为 Guice 的早期版本,因此将这一行添加到 struts.xml 成为问题
<constant name="struts.objectFactory" value="guice" />
并在 web.xml 中指定 StrutsPrepareAndExecuteFilter
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/* </url-pattern>
</filter-mapping>
这应该足以让任何有类似设置问题的人开始。