gpt4 book ai didi

android - Dagger 2 不提供我的单例类,为什么?

转载 作者:行者123 更新时间:2023-11-29 16:50:39 24 4
gpt4 key购买 nike

我有一个类:

public class MyFactory {
public MyFactory() {
}

}

我的 Dagger 模块:

@Module
public class MyModule {
@Provides
@Singleton
public MyFactory provideMyFactory() {
return new MyFactory();
}
}

我的组件:

@Singleton
@MyScope
@Component(modules = MyModule.class)
public interface MyComponent {
MyFactory getMyFactory();
}

我的范围:

@Scope
@Retention(RetentionPolicy.CLASS)
public @interface MyScope {
}

我希望 Dagger2 提供的 MyFactory 实例是单例,但事实并非如此。我试图在项目的两个地方调用以下代码:

MyFactory factory = DaggerMyComponent.builder()
.build()
.getMyFactory();
Logcat.d("tag", "factory = " + factory);

我的日志显示:

factory = :com.my.app.MyFactory@eaa9330
factory = :com.my.app.MyFactory@8bd552e

如您所见,它们是两个实例。所以,我的问题是:

问题 1.在上面的例子中,为什么 Dagger 不提供 MyFactory 作为单例??

问题 2. 使用我上面的代码,是否每次调用 DaggerMyComponent.builder().build(); 创建一个新的 MyComponent 实例>?

问题 3. Dagger 还允许通过在构造函数中放置一个@Inject 注释来注入(inject)开发人员的类实例而无需打扰模块:

public class MyFactory {
@Inject
public MyFactory() {
}
}

开发者只需通过@Inject MyFactory factory;即可使用在这种情况下,如何使用 Dagger 2 制作 MyFactory 单例?

最佳答案

作用域是每个组件。如果您创建多个组件,那么您将创建多个对象。 @Singleton 也不异常(exception)。

// same component
DaggerMyComponent firstComponent = DaggerMyComponent.builder().build();

firstComponent.getMyFactory() == firstComponent.getMyFactory(); // true


// second component
DaggerMyComponent secondComponent = DaggerMyComponent.builder().build();

firstComponent.getMyFactory() == secondComponent.getMyFactory(); // false

您必须保留组件实例并重用它们,否则您将始终创建新的引用。例如。一种常见的方法是将 @Singleton AppComponent 放在您的 Application 中,并在需要时从那里获取它。

In this case, how to make MyFactory singleton with Dagger 2?

通过构造函数注入(inject),您只需将作用域添加到类的顶部。

@Singleton // place scope _on_ the class
public class MyFactory {
@Inject
public MyFactory() {
}
}

关于android - Dagger 2 不提供我的单例类,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46546535/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com