匕首自动注射

时间:2014-04-10 04:35:11

标签: android dagger

我在使用dagger的简单项目中有3个类:

public class MyActivity extends Activity {
    @Inject
    public MyController controller;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setContentView(R.layout.search);
        super.onCreate(savedInstanceState);
        objectGraph = ObjectGraph.create(new BootstrapModule(this));
        objectGraph.inject(this);
        System.out.println("MyActivity.controller: " + controller);
    }
}

public class MyController {
    @Inject
    public EventDispatcher eventDispatcher;

    public MyController()
    {
        System.out.println("MyController.eventDispatcher: " + eventDispatcher); // THIS IS NULL!
    }
}

@Module(injects = {
        MyActivity.class,
        MyController.class
})
public class BootstrapModule {
    private Context context;

    public BootstrapModule(Context context){
        this.context = context;
    }

    @Provides
    @Singleton
    public EventDispatcher provideEventDispatcher(){
        return new EventDispatcher();
    }

    @Provides
    @Singleton
    public Context provideContext(){
        return context;
    }
}

现在我的问题是MyActivity控制器是在objectGraph.inject(this)方法调用之后由dagger创建的。 但是在MyController中没有创建eventDispatcher。我是否可以从Activity objectGraph.inject(控制器)再次调用dagger创建EventDispatcher?应该自动完成吗?

2 个答案:

答案 0 :(得分:2)

字段注入在MyController的构造函数完成后完成。因此,在构造函数执行期间,尚未设置EventDispatcher实例。如果你在这行“objectGraph.inject(this);”之后断开你的代码在你的onCreate中,你会看到已经设置了EventDispatcher。

要解决此问题,您需要切换到构造函数注入。您可以通过将@Inject从EventDispatcher字段移动到MyController构造函数并将EventDispatcher添加为依赖项来完成此操作。

public class MyController {

    public EventDispatcher eventDispatcher;

    @Inject
    public MyController(EventDispatcher eventDispatcher)
    {
        this.eventDispatcher = eventDispatcher;
        System.out.println("MyController.eventDispatcher: " + eventDispatcher); // THIS WON'T BE NULL!
    }
}

答案 1 :(得分:0)

注入永远不会自动发生,但遵循@Inject给出的提示。你可以通过构造函数注入或手动注入,任何一种方式都有自己的优点和缺点。我个人更喜欢手动注射,因为它提供了更多的控制。

通过构造函数注入

  • 依赖关系将在层次结构中自动解决
  • 无需通过组件
  • 声明此注入规则

N

  • 您无法控制注射何时发生

手动注射

  • 控制生命周期,可以使用不同的组件多次注射

缺点

  • 需要编写额外的代码才能实现它