如何用匕首2注射到Servlet中?

2022-09-02 01:59:30

我在这里为Dagger 1问了(并回答了)同样的问题。我该如何为《匕首2》做类似的事情,现在它已不复存在。ObjectGraph.inject

这个问题可以推广到:

如果对象必须由其他框架创建,如何进行成员注入?(在本例中为 Servlet 容器)。


答案 1

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

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

添加成员注入器<...>到您的@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...
    }
}

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


答案 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()

推荐