11

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

谁能帮助我一些基本的例子或概念。我认为这对所有使用匕首的人都有帮助。

4

2 回答 2

5

如果您查看注释的文档,带@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);
    }

}

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

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

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

于 2015-09-02T06:33:25.767 回答
0

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

于 2014-09-08T19:18:07.633 回答