You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 方法:
    import dagger.Component;
    import javax.inject.Singleton;
    
    @Singleton
    @Component(modules = YourConfigModule.class)
    public interface AppComponent {
      // 声明IServerConfig的获取方法
      IServerConfig serverConfig();
      void inject(ClassX classX);
    }
    
    之后在业务类中注入Component调用对应方法即可:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.17 20:15:07