如何使用Dagger 2注入Servlet?

Ben*_*Ben 22 java servlets dagger dagger-2

我问(回答)对匕首1同样的问题在这里.我如何为Dagger 2做类似的事情,现在ObjectGraph.inject不再存在了.

这个问题可以概括为:

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

Mat*_*iak 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();
}
Run Code Online (Sandbox Code Playgroud)

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

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...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 啊; 也可以在Component接口中创建一个带有对象的void方法,它将对它执行成员注入.这比这里提供的源代码更简单,但功能相同.以下是相关文档:https://google.github.io/dagger/api/2.0/dagger/Component.html (2认同)