Android:Dagger 2和构造函数注入

Ela*_*adB 5 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!

    }

}
Run Code Online (Sandbox Code Playgroud)

尽管我在构造函数上方使用了"@Inject"注释,但"MyClass"仍然需要"Context".我错过了什么?

我甚至需要公开我的上下文吗?

谢谢.

Dav*_*jak 10

嗯...你声明你的构造函数

public MyClass(Context context)  {
    this.mAppContext = context
}
Run Code Online (Sandbox Code Playgroud)

然后不带任何参数调用它

MyClass my = new MyClass(); // The IDE requests context!
Run Code Online (Sandbox Code Playgroud)

为什么你认为这应该有效?这是普通的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
    }

}
Run Code Online (Sandbox Code Playgroud)

鉴于你提供了Context某个地方(Context must be provided...如果不是,你会得到编译错误),然后dagger将MyClass通过调用 inject -no magic 注入你的活动.该inject方法将对象分配给您的字段.


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