如何使用Dagger 2注入Servlet?

时间:2015-04-07 16:01:39

标签: java servlets dagger dagger-2

我向Dagger 1 here询问(并回答)了同样的问题。如果ObjectGraph.inject不再存在,我将如何为Dagger 2做类似的事情。

这个问题可以概括为:

如果对象必须由其他框架创建,那么如何成员注入? (在这种情况下,是一个Servlet容器)。

2 个答案:

答案 0 :(得分:8)

我一直试图回答同样的问题。我认为我已经接近它应该如何"理想的工作,但我只是围绕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...
    }
}

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

答案 1 :(得分:0)

虽然我对此不太满意,因为我必须编写样板代码,但这样的东西适用于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()
相关问题