Android:Dagger 2和构造函数注入

时间:2016-05-16 12:45:23

标签: java android dependency-injection dagger dagger-2

我是匕首的新手,我的构造函数/方法注射似乎不起作用。 不起作用意味着仍然要求注入的字段。

这是我的代码:

@Module
public class AppContextModule {

    private final Context appContext;

    public AppContextModule(Context appContext) {
        this.appContext = appContext;
    }

    @Singleton
    @Provides
    public Context getAppContext() {
        return appContext;
    }

}

@Singleton
@Component(modules = {AppContextModule.class})
public interface MyComponent {

    void inject(ActivitiesLifeCycleListener obj);

    void inject(WebViewManager obj);

    Context context();

}

public final class MyClass {

    private final WeakReference<Context> mAppContext;

    @Inject
    public MyClass(Context context)  {
        this.mAppContext = context
    }

}

public class MyActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyClass my = new MyClass(); // The IDE requests context!

    }

}

&#34; MyClass的&#34;仍需要&#34; Context&#34;虽然我使用了&#34; @Inject&#34;构造函数上方的注释。 我错过了什么?

我是否需要公开我的上下文?

感谢。

1 个答案:

答案 0 :(得分:10)

嗯......你宣布你的构造函数

public MyClass(Context context)  {
    this.mAppContext = context
}

然后在没有任何参数的情况下调用它

MyClass my = new MyClass(); // The IDE requests context!

为什么你认为这应该有用吗?这是普通的java,没有涉及匕首,你试图在不提供所需参数的情况下创建一些新对象。

Dagger并没有改变java工作原理的魔力。要使用构造函数注入,您必须实际使用Dagger来注入字段。

public class MyActivity extends BaseActivity {

    @Inject
    MyClass mMyClass; // mark field for injection

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // todo ... create component

        component.inject(this); // inject fields
    }

}

鉴于您在某处提供Context(如果不是,您将收到Context must be provided...编译错误)dagger将通过调用<MyClass注入您的活动/ strong> inject - 没有魔法。 inject方法会将对象分配给您的字段。

构造函数注入仅表示您不必使用模块并包含提供对象的方法。它不仅可以凭空创造物体,也不会改变构造者的工作方式。