【问题标题】:Add Guice dependency Injection to Servlets configured in web.xml将 Guice 依赖注入添加到 web.xml 中配置的 Servlet
【发布时间】:2015-12-29 00:17:31
【问题描述】:

我在一个项目中使用 Guice 将依赖项注入到 Servlet 中。我们有一个 ServletModule 定义了 serve().with() 配置。这一切都很好。

我现在需要能够包含一个带有在 web.xml 中定义的 servlet 的 webapp。所有文档都说将 GuiceFilter 添加到 web.xml,然后使用 ServletModule 中的程序配置,但我想知道是否可以让 Guice 将依赖项注入到 web.xml 中配置的 servlet 中?

我希望能够在 web.xml 中定义 servlet,例如:

 <servlet>
   <servlet-name>test</servlet-name>
   <servlet-class>TestServlet</servlet-class>
 <servlet>

当创建 servlet 时,容器只调用了无参数构造函数。是否可以更改此行为,以便 Guice 创建 servlet 并在创建时注入?

【问题讨论】:

    标签: java servlets dependency-injection guice


    【解决方案1】:

    injector.injectMembers(obj) 显式设置@Inject 字段:

    @Inject Foo foo;
    
    TestServlet()
    {
        // wherever your injector instance is defined
        ...getInjector().injectMembers(this);
    }
    

    The docs推荐getInjector().getMembersInjector().injectMembers() 虽然我没用过。

    【讨论】:

      【解决方案2】:

      您可能需要在 TestServlet 中使用 Guice 作为服务定位器。

          TestServlet(Foo foo){ ... } // please inject foo!
      
          TestServlet()
          {
              this( MyGuiceServletConfig.injector.getInstance(Foo.class) );
          }
      
      --
      
      public class MyGuiceServletConfig extends GuiceServletContextListener {
      
          public static final Injector = Guice.createInjector(new MyServletModule());
      
          @Override
          protected Injector getInjector() {
            return injector; 
          }
      }
      

      (他们说 DI 框架不是侵入性的 :)

      【讨论】:

      • 很好的答案!我有点希望不要做这种事情,但谢谢你提供如何做的细节:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多