如果您查看注释的文档,带@Module
注释的类定义了一个有助于 dagger 对象图的类。例如,在 Spring 框架中,等价物是@Configuration
注释。它为您的对象图定义了一个配置点,您可以在其中声明您希望哪些对象可用于注入及其范围。
举个简单的例子,假设我们希望应用程序中的任何 Activity 都使用一个单例对象。它必须在模块中创建:
@dagger.Module(injects = {MyActivity.class})
public class Module {
@Provides
@Singleton
public MySinletonBean provideMySingleton() {
return new MySinletonBean();
}
}
这将创建一个MySingleton
可以注入的对象MyActivity
。这是一个非常基本的示例,但我们可以在图中执行其他操作,例如在构造函数中使用依赖项:
@dagger.Module(injects = {MyActivity.class})
public class Module {
private DependencyBean dependency = new DependencyBean();
@Provides
@Singleton
public MySinletonBean provideMySingleton() {
return new MySinletonBean(dependency);
}
@Provides
@Singleton
public MySinletonBean provideMyOtherSingleton() {
return new MyOtherSinletonBean(dependency);
}
}
然后,MyActivity
我们需要在onCreate
方法中访问应用程序的图形:
@Inject
MySingletonBean singleton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
((MyApplication) getApplication()).getGraph().inject(this);
}
那么,谁在这里创建对象图呢?当您的应用程序启动时,MyApplication
该类会执行此操作(不要伪造将其添加到您的androidManifest.xml
):
public class MyApplication extends Application {
private ObjectGraph graph;
public ObjectGraph getGraph() {
return graph;
}
@Override
public void onCreate() {
super.onCreate();
graph = ObjectGraph.create(new Module(this));
graph.inject(this);
}
}
因此,匕首应用程序中的执行流程将是:
android 应用程序启动,MyApplication
该类构建图形,解析带@Module
注释的类并保留它的实例。
然后,模块中声明的类可以访问其对象,只需将自己注入对象图中。Gradle 然后将评估它们的@Inject
注释并执行依赖注入。