@Module在dagger for android中意味着什么?

时间:2014-09-08 10:54:05

标签: android dagger android-bootstrap

我已经阅读了很多博客,但我仍然无法弄清{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概念,所以我只是陷入困境。

任何人都可以帮我解决一些基本的例子或概念。我认为这对所有使用匕首的人都有帮助。

2 个答案:

答案 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);
    }

}

因此,匕首应用程序中的执行流程为:

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

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

答案 1 :(得分:0)

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