2

我的任务是将我自己在 Waffle 框架中使用 PicoContainer 作为 DI 机制开发的应用程序转换为我们的新“堆栈”,即使用 Struts2 作为框架,Guice 作为 DI 机制。关于如何以最小的痛苦做到这一点,同时从新框架和 DI 机制中获得最佳效果,有没有人有任何有用的指示?

提前谢谢了。

4

1 回答 1

3

是的,我意识到这个问题有点含糊,但我最终还是完成了。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.classRequestScoped.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>

这应该足以让任何有类似设置问题的人开始。

于 2009-08-27T22:17:53.297 回答