Android Dagger 2 Dependency没有被注入

我正在尝试将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(); } } 

会发生什么是我在存储库中得到一个空指针exception。 他没有被注射。

如果我添加此行:

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

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

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

提前致谢,

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可以做到的)。