用Dagger将依赖注入Singleton?

spi*_*ce7 3 java android dependency-injection dagger

是否有可能让Dagger为你注射单身人士?

事实上,我只找到了一种手动为单身人士提供依赖关系的方法:

@Provides
@Singleton
public Dispatcher providesDispatcher(Context context, PPreferences preferences,
                                                       FileNameCache fileNameCache) {
    return new Dispatcher(context, preferences, fileNameCache);
}
Run Code Online (Sandbox Code Playgroud)

这是定义单身人士的唯一方法吗?我更喜欢做的是以下内容,以便Dagger自己注入依赖项,但这样做会给我一个错误.

@Provides
@Singleton
public Dispatcher providesDispatcher(Dispatcher dispacher) {
    return dispacher;
}
Run Code Online (Sandbox Code Playgroud)

也许还有另一种方法来定义单身,这将允许我注入其他单身人士吗?

任何帮助表示赞赏.

编辑: 我刚刚意识到我正在使用另一个Singleton进行第二种方法,但是当我将实现映射到接口时,情况略有不同:

@Provides
@Singleton
public Tracker providesTracker(TrackerImpl tracker) {
    return tracker;
}
Run Code Online (Sandbox Code Playgroud)

TrackerImpl也注入了上面提到的PPreferences的实例.

当我尝试使用第二个示例创建Dispatcher时,这是我得到的错误:

error: Unknown error java.lang.IllegalStateException thrown by javac in graph validation: Dependency cycle:
0. com.example.test.Dispatcher bound by @Singleton/ProviderMethodBinding[provideKey="com.example.test.Dispatcher", memberskey="null"]
0. com.example.test.Dispatcher
Run Code Online (Sandbox Code Playgroud)

Ste*_*vik 9

您不需要在模块上使用@Provides方法来创建Dispatcher单例实例.只需使用@Inject注释Dispatcher构造函数,使用@Singleton注释类.注入Dispatcher实例时,Dagger将使用该实例.

@Singleton
public class Dispatcher 
{
    @Inject
    public Dispatcher(..)
}
Run Code Online (Sandbox Code Playgroud)