如何创建/提供EagerSingleton

我在Dagger 2依赖注入框架遇到问题。 我想创建一个EagerSingleton。 我假设当我使用@Singleton注解时,匕首2会创建延迟加载的单例。 如何使用Dagger 2框架创建EagerSingleton?


我通过创建一个EagerModule来解决这个问题,它有一个返回Void提供方法。 我希望创建的所有内容都是作为参数指定的。 然后我在创建组件后立即调用的组件添加了一个Void init()方法。

@Module
public class EagerModule {

    @Provides
    @Nullable
    Void provideEager(...) {
        // this eagerly builds any parameters specified and returns nothing
        return null;
    }
}

@Component(modules = {EagerModule.class})
public interface TestComponent {

    @Nullable
    Void init();
}

这显然不会让你访问急切创建的单身人士,但对于我的用法,我不需要访问,我只是想让他们创建。


我想出了如何做到这一点:

根据文档匕首直接不支持eagerSingletons:

通过创建一个EagerSingletons类来为每个渴望的单例声明静态字段。 方法注射。

所以我在任何模块中创建了一个EagerSingletons类,我想使用一个急切的单例。 在那个渴望的Singletons类中,我会声明我想要使用的任何单例。 那就是它,匕首然后让这些单身的人很渴望。

更新:我用匕首1作为例子的原因是,这是如何在匕首中完成的。实际上没有eagerSingletons的机制。 你必须使用静态字段。 让我给你一个如何创建一个eagerSingleton的例子:

In every module you need a eager singleton you could have this:
    //assume this file is called myModule.java



static EagerObjects eagerObjects;

    public static void initEagerObjects() {
        if (eagerObjects == null) {
            eagerObjects = new EagerObjects();
        }
    }
//so far so good, only one object will be created, lets inject what we need immediately
    public static class EagerObjects {

        public EagerObjects() {
          //inject right away,you'll have to figure out a way to pass the graph in. by constructor param should be fine
            getGraph().inject(this);
        }

        //make this injection static
        @Inject
        static CoffeePot coffeePot;
    }
}

现在找到一种方法来在应用程序启动时立即调用它....

回到你的dagger组件或扩展的应用程序类中,你可以有一个静态方法来调用每个模块的每一个:

  static void injectAllEagerObjects() {
            myModule.initEagerObjects();
            someOtherModule.initEagerObjects();
            //...all of them can be here since there static

}

现在我们快要完成了,只需在应用程序启动时调用它即可。 所以,当你从应用程序创建你的图形后,你必须调用injectAllEagerObjects()(如果你愿意的话,可能会传入你的图形实例)。 这将以正确的方式初始化渴望的单身人士,并且只会进行一次。

所有这一切说,我希望匕首只是有一个注释,你可以像这样使用:@singleton(eager = true),但是静态字段,这是他们现在推荐的。


这是我为Dagger2提出的一个可复制的例子,我不认为有一种方法可以避免(冗余)在组件中声明哪些模块具有渴望的对象。

如果有人能够提供一个较少的样板例子,那将会很好。

Main.java

import dagger.Component;
import dagger.Module;
import dagger.Provides;
import javax.inject.Inject;
import javax.inject.Singleton;

public class Main {
    public static void main(String[] args) {
        TestComponent component = DaggerTestComponent.create();
        System.out.println("Created component.");

        component.createEagerSingletons();
    }
}

@Component(modules = {TestModule1.class, TestModule2.class})
@Singleton
abstract class TestComponent {

    abstract EagerSingletons createEagerSingletons();

    static class EagerSingletons {
        @Inject EagerSingletons() { System.out.println("Building all eager objects.."); }

        @Inject TestModule1.EagerSingletons m1;
        @Inject TestModule2.EagerSingletons m2;
    }

}

@Module
class TestModule1 {
    static class Thing1 { @Inject Thing1(){}}
    static class Thing2 { @Inject Thing2(){}}

    @Provides
    @Singleton
    Thing1 first() { return new Thing1(); }
    @Provides
    @Singleton
    Thing2 secon() { return new Thing2(); }

    static class EagerSingletons {
        @Inject Thing1 a;
        @Inject Thing2 b;

        @Inject EagerSingletons() { System.out.println("[1] Eagerly built objects!"); }
    }

}

@Module
class TestModule2 {
    static class EagerSingletons {
        @Inject EagerSingletons() { System.out.println("[2] Eagerly built objects!"); }
    }
}

主要方法将打印:

Created component.
Building all eager objects..
[1] Eagerly built objects!
[2] Eagerly built objects!
链接地址: http://www.djcxy.com/p/85999.html

上一篇: how to create/provide a EagerSingleton

下一篇: How do i add a cookie to cache stylesheet change in this script