我向Dagger 1 here询问(并回答)了同样的问题。如果ObjectGraph.inject
不再存在,我将如何为Dagger 2做类似的事情。
这个问题可以概括为:
如果对象必须由其他框架创建,那么如何成员注入? (在这种情况下,是一个Servlet容器)。
答案 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()