Dagger中有没有与Guice的getInstance()功能等效的实现方法?
Dagger实现类似Guice
injector.getInstance功能的方案 Dagger 没有提供和Guice Injector完全一致的运行时动态传Class获取实例的API,但可以通过以下三种方式实现同等效果,按推荐优先级排序:
- 方案1:直接注入目标实例(最优解)
Dagger的最佳实践是优先显式声明依赖,由框架自动注入实例,编译期即可完成依赖合法性校验,避免运行时错误。示例代码如下:import javax.inject.Inject; public class ClassX { private final IServerConfig serverConfig; @Inject public ClassX (IServerConfig serverConfig) { this.serverConfig = serverConfig; } void methodA(){ // 直接使用预注入的实例即可 final IServerConfig config = serverConfig; } } - 方案2:注入
Provider<T>实现延迟/动态获取
如果你需要在特定时机才初始化实例,或者每次调用都需要获取新实例,可以注入javax.inject.Provider类型的对象,调用get()方法即可获取实例,逻辑和injector.getInstance非常接近:import javax.inject.Inject; import javax.inject.Provider; public class ClassX { private final Provider<IServerConfig> serverConfigProvider; @Inject public ClassX (Provider<IServerConfig> serverConfigProvider) { this.serverConfigProvider = serverConfigProvider; } void methodA(){ // 实例的作用域和你配置的一致,比如@Singleton注解的类每次get都会返回同一个实例 final IServerConfig serverConfig = serverConfigProvider.get(); } } - 方案3:注入Component实例实现全局获取能力
如果你确实需要类似Guice Injector的全局获取入口,可以直接注入Dagger生成的Component实例,需要提前在Component接口中声明对应类型的获取方法:
首先定义Component的 provision 方法:
之后在业务类中注入Component调用对应方法即可:import dagger.Component; import javax.inject.Singleton; @Singleton @Component(modules = YourConfigModule.class) public interface AppComponent { // 声明IServerConfig的获取方法 IServerConfig serverConfig(); void inject(ClassX classX); }
注意:该方案不推荐大范围使用,会导致项目依赖关系不清晰,维护成本升高。import javax.inject.Inject; public class ClassX { private final AppComponent appComponent; @Inject public ClassX (AppComponent appComponent) { this.appComponent = appComponent; } void methodA(){ // 效果完全等价于Guice的injector.getInstance(IServerConfig.class) final IServerConfig serverConfig = appComponent.serverConfig(); } }
额外说明:Dagger是编译时依赖注入框架,所有依赖关系都需要在编译期确定,因此不支持Guice那种运行时传入任意Class对象动态获取实例的能力,所有需要动态获取的类型都需要提前在依赖配置中声明。
内容的提问来源于stack exchange,提问作者babajaj
相关产品推荐
相关产品推荐

