我已经阅读了很多博客,但我仍然无法弄清{1 {}中@Module
注释的功能。
@Inject
我得到它在运行时提供依赖注入。但@Module
做了什么。
因为对象图也是建立在模块上的。
例如,我有https://github.com/AndroidBootstrap/android-bootstrap的代码片段。
@Module(
complete = false,
injects = {
BootstrapApplication.class,
BootstrapAuthenticatorActivity.class,
MainActivity.class,
BootstrapTimerActivity.class,
}
)
public class BootstrapModule {
}
所以它基本上做了什么。因为我也在尝试使用dagger构建一个应用程序作为android的依赖注入。但由于我无法清楚地得到@Module
概念,所以我只是陷入困境。
任何人都可以帮我解决一些基本的例子或概念。我认为这对所有使用匕首的人都有帮助。
答案 0 :(得分:5)
如果你看一下to the docs for the annotation,@Module
带注释的类定义了一个有助于匕首对象图的类。例如,在Spring框架中,等效的是@Configuration
anntotation。它定义了对象图的配置点,您可以在其中声明要注入的对象及其范围。
举个简单的例子,我们假设我们希望应用中的任何活动都使用单个对象。它必须在模块中创建:
@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
注释并执行依赖注入。
答案 1 :(得分:0)
我猜注释处理工具要求在编译时生成代码。 这使得Dagger可以在编译时提供验证,而不仅仅是在运行时。