Android Dagger 2 Dependency没有被注入

时间:2015-07-12 21:43:01

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

我试图将Dagger 2用于我的应用程序,但我在实体存储库方面遇到了一些问题,而且我还没有弄清楚我错过了什么。

这是我的应用程序组件:

@Singleton
@Component(
        modules = {
                AndroidModule.class,
                RepositoryModule.class
        }
)

public interface ApplicationComponent {
    void inject(AndroidApplication app);
    IDependenceyRepository dependencyRepository();
}

我的模块:

@Module
public class RepositoryModule {
    @Provides @Singleton IDependenceyRepository provideDependendencyRepository(Context context) {
        return new DependencyRepository(context);
    }
}

@Module
public class AndroidModule {
    private final AndroidApplication app;

    public AndroidModule(AndroidApplication app) {
        this.app = app;
    }

    @Provides @Singleton Context provideApplicationContext() {
        return app;
    }
}

我的AndroidApplication:

public class AndroidApplication extends Application {
    private ApplicationComponent component;

    @Override
    public void onCreate() {
        super.onCreate();
        setupGraph();
    }

    private void setupGraph() {
        component = DaggerApplicationComponent.builder()
                .androidModule(new AndroidModule(this))
                .repositoryModule(new RepositoryModule())
                .build();
        component.inject(this);
    }

    public ApplicationComponent component() {
        return component;
    }
}

这是我的活动:

public class MainActivity extends Activity {
    @Inject
    IDependenceyRepository repository;

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

    private void testRepository() {
        Dependency dep = new Dependency();
        dep.setDescription("XXX");
        dep.setName("AAAA");

        try {
            repository.save(dep);
            Log.d("", repository.queryAll().get(0).getName());
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

我会在存储库中获得空指针异常。他没有被注射。

如果我添加此行:

repository = ((AndroidApplication) getApplication()).component().dependencyRepository();

它有效,但DI的重点是不必担心这个,或者我错了吗?

我已经尝试了其他一些示例和教程,但没有设法解决我的问题。

提前致谢,

1 个答案:

答案 0 :(得分:9)

david.mihola的评论是正确的:为了能够初始化@Inject字段,您需要在组件中使用方法(通常为void inject(MyClass))。

如果您有基类,值得注意(不是专门针对您的问题,但可能会出现):

public class BaseActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ((AndroidApplication) getApplication()).component().inject(this);
    }
} 

并在您的组件中:

void inject(BaseActivity);

注入具有自己的@Inject字段的子类不会工作:

public class ActualActivity extends BaseActivity {
    @Inject IDependenceyRepository repo;
}

这是因为Dagger需要知道将在编译时注入的具体类,而不是运行时(就像Dagger 1可以做的那样)。