如果您查看
注释文档,带有
@Module
注释的类定义了一个对dagger对象图有贡献的类。例如,在Spring框架中,相当于
@Configuration
注释。它为对象图定义了一个配置点,在这里您声明要使哪些对象可用于注入及其范围。
作为一个简单的例子,假设我们希望任何活动都使用单例对象。它必须在模块中创建:
@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);
}
}
因此,在Dagger应用程序中的执行流程如下:
Android应用程序启动,并且MyApplication
类构建图形,解析@Module
注释的类并保留其实例。
然后,模块中声明的类可以访问它的对象,只需将自己注入对象图形中。Gradle将评估其@Inject
注释并执行依赖项注入。