在Dagger for Android中,@Module是什么意思?

11

我已经阅读了很多博客,但仍然无法理解Dagger中@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概念,所以我卡住了。

请问有没有人可以帮我提供一些基本的例子或概念?我认为这将对所有使用Dagger的人都有帮助。

2个回答

7
如果您查看注释文档,带有@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应用程序中的执行流程如下:

  1. Android应用程序启动,并且MyApplication类构建图形,解析@Module注释的类并保留其实例。

  2. 然后,模块中声明的类可以访问它的对象,只需将自己注入对象图形中。Gradle将评估其@Inject注释并执行依赖项注入。


0

我猜测注解处理工具需要在编译时生成代码。这使得Dagger可以在编译时提供验证,而不仅仅是在运行时。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接