如何使用 Dagger 2 注入 Servlet?
How do I inject into a Servlet with Dagger 2?
我针对 Dagger 1 here 问(并回答)了同样的问题。既然 ObjectGraph.inject
不再存在,我将如何为 Dagger 2 做类似的事情。
这个问题可以概括为:
如果对象必须由不同的框架创建,你如何成员注入? (在本例中,是一个 Servlet 容器)。
我一直在尝试回答同样的问题。我 认为 我已经接近它 "should" 的理想工作方式,但我只是在 GitHub 项目周围徘徊并试图根据那里的信息碎片,因为 Dagger 2 的许多文档仍在编写中(截至本周)。
我下面的示例代码实际上是针对 Android Activity,但我相信同样的方法应该适用于您询问的 servlet。
将 MembersInjector<...> 添加到您的 @Component 接口;例如,在下面的组件中,我为 MainActivity class:
添加了一个
package ...;
import javax.inject.Singleton;
import dagger.Component;
import dagger.MembersInjector;
@Singleton
@Component(modules = { PlaygroundModule.class })
public interface MainComponent {
Wizard createWizard();
MembersInjector<MainActivity> mainActivityInjector();
}
然后在您想要注入成员的 class 中,在对象创建后的适当位置但在您需要使用注入的成员之前,您需要创建组件并使用成员注入:
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...
}
}
我不清楚的一件事是,这种在应该注入的对象内部创建组件的模式是否正确。感觉不太对,但是,它仍然非常灵活,因为您只是紧紧地绑定到组件而不是模块。所以也许这是正确的方法,但也许有点不对。
虽然我对此不太满意,因为我必须编写样板代码,但类似这样的东西适用于 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()
我针对 Dagger 1 here 问(并回答)了同样的问题。既然 ObjectGraph.inject
不再存在,我将如何为 Dagger 2 做类似的事情。
这个问题可以概括为:
如果对象必须由不同的框架创建,你如何成员注入? (在本例中,是一个 Servlet 容器)。
我一直在尝试回答同样的问题。我 认为 我已经接近它 "should" 的理想工作方式,但我只是在 GitHub 项目周围徘徊并试图根据那里的信息碎片,因为 Dagger 2 的许多文档仍在编写中(截至本周)。
我下面的示例代码实际上是针对 Android Activity,但我相信同样的方法应该适用于您询问的 servlet。
将 MembersInjector<...> 添加到您的 @Component 接口;例如,在下面的组件中,我为 MainActivity class:
添加了一个package ...;
import javax.inject.Singleton;
import dagger.Component;
import dagger.MembersInjector;
@Singleton
@Component(modules = { PlaygroundModule.class })
public interface MainComponent {
Wizard createWizard();
MembersInjector<MainActivity> mainActivityInjector();
}
然后在您想要注入成员的 class 中,在对象创建后的适当位置但在您需要使用注入的成员之前,您需要创建组件并使用成员注入:
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...
}
}
我不清楚的一件事是,这种在应该注入的对象内部创建组件的模式是否正确。感觉不太对,但是,它仍然非常灵活,因为您只是紧紧地绑定到组件而不是模块。所以也许这是正确的方法,但也许有点不对。
虽然我对此不太满意,因为我必须编写样板代码,但类似这样的东西适用于 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()