【问题标题】:How do I inject into a Servlet with Dagger 2?如何使用 Dagger 2 注入 Servlet?
【发布时间】:2015-04-07 16:01:39
【问题描述】:

我对 Dagger 1 here 提出了(并回答了)同样的问题。既然ObjectGraph.inject 不再存在,我该如何为 Dagger 2 做类似的事情。

这个问题可以概括为:

如果对象必须由不同的框架创建,你如何进行成员注入? (在这种情况下,是一个 Servlet 容器)。

【问题讨论】:

    标签: java servlets dagger dagger-2


    【解决方案1】:

    我一直在尝试回答同样的问题。我认为我已经接近了它“应该”如何理想地工作,但我只是在 GitHub 项目周围徘徊,并试图根据那里的信息碎片来弄清楚它,因为很多Dagger 2 的文档仍在编写中(截至本周)。

    我下面的示例代码实际上是针对 Android Activity 的,但我相信同样的方法应该适用于您询问的 servlet。

    将 MembersInjector<...> 添加到您的 @Component 接口;例如,在下面的组件中,我为 MainActivity 类添加了一个:

    package ...;
    
    import javax.inject.Singleton;
    import dagger.Component;
    import dagger.MembersInjector;
    
    @Singleton
    @Component(modules = { PlaygroundModule.class })
    public interface MainComponent {
        Wizard createWizard();
        MembersInjector<MainActivity> mainActivityInjector();
    }
    

    然后在您想要成员注入的类中,在对象创建之后但在需要使用注入成员之前的适当位置,您需要创建组件并使用成员注入:

    package ...;
    
    // other imports
    import javax.inject.Inject;
    import dagger.MembersInjector;
    
    public class MainActivity extends ActionBarActivity {
    
        @Inject
        Wizard wizard;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            MainComponent c = DaggerMainComponent.create();
            c.mainActivityInjector().injectMembers(this);
    
            // other code...
        }
    }
    

    我不清楚的一件事是这种在应该注入的对象内创建组件的模式是否正确。感觉不太对劲,但是它仍然非常灵活,因为您只是紧密地绑定到组件而不是模块。所以也许这是正确的方法,但也许有点不对。

    【讨论】:

    • 啊;也可以在您的 Component 接口中创建一个接受对象的 void 方法,并且它将对其执行成员注入。这将比此处提供的源代码简单一点,但功能相同。以下是相关文档:google.github.io/dagger/api/2.0/dagger/Component.html
    【解决方案2】:

    虽然我对此不太满意,因为我必须编写样板代码,但类似这样的东西适用于 servlet。

    public class MyServlet extends HttpServlet {
    
      @Inject
      MyService service;
    
      @Override
      public void init( ServletConfig config ) throws ServletException {
        super.init(config);
        this.service = MyDaggerComponent.create().injectMyService();
      }
    }
    

    可以考虑将 MyDaggerComponent 实例设置成 ServletContext,然后在 init() 方法中这样获取:

    ((MyDaggerComponent)config.getServletContext().getAttribute("MyDaggerComponent")).injectMyService()
    

    【讨论】:

    • 如果我有一个构造函数依赖项,比如 GraohQl
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多