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

Android Dagger2:如何在非Activity/Fragment类中使用依赖注入

在非Activity/Fragment的Java类中实现Dagger依赖注入

嗨,我来帮你搞定这个问题!其实在普通Java类里用Dagger做依赖注入并不复杂,主要有两种常用的方式,我给你一步步讲清楚:

方式一:构造函数注入(推荐)

这是Dagger最推荐的注入方式,只要你的类允许修改构造函数,优先用这个:

  1. 给普通类的构造函数添加@Inject注解
    假设你的普通类叫MyCustomClass,里面需要注入ApiService这类依赖,直接在构造函数上标记@Inject,并把依赖通过构造参数传入:

    public class MyCustomClass {
        private final ApiService apiService;
    
        // 用@Inject标记构造函数,Dagger会自动处理依赖注入
        @Inject
        public MyCustomClass(ApiService apiService) {
            this.apiService = apiService;
        }
    
        // 你的业务逻辑方法
        public void executeTask() {
            apiService.requestData();
        }
    }
    
  2. 在其他已注入类中直接使用
    如果这个MyCustomClass是被Activity/Fragment或者其他已经通过AndroidInjection.inject()完成注入的类调用,那直接在这些类里用@Inject声明即可:

    public class MainActivity extends AppCompatActivity {
        // Dagger会自动创建MyCustomClass实例并注入
        @Inject
        MyCustomClass myCustomClass;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            AndroidInjection.inject(this);
            super.onCreate(savedInstanceState);
            // 直接使用
            myCustomClass.executeTask();
        }
    }
    
  3. 主动获取实例(如果需要单独创建)
    要是你需要在任意地方主动获取MyCustomClass的实例,先在你的ApplicationComponent里添加一个获取方法:

    @Singleton
    @Component(modules = { AndroidSupportInjectionModule.class, ApplicationModule.class, ActivityBuilder.class})
    public interface ApplicationComponent extends AndroidInjector<DaggerApplication> {
        void inject(AppController appController);
    
        // 添加这个方法,让Component能提供MyCustomClass实例
        MyCustomClass getMyCustomClass();
    }
    

    然后在你的AppController(继承DaggerApplication的类)里保存Component的全局实例:

    public class AppController extends DaggerApplication {
        private static ApplicationComponent appComponent;
    
        @Override
        protected AndroidInjector<? extends DaggerApplication> applicationInjector() {
            appComponent = DaggerApplicationComponent.create();
            return appComponent;
        }
    
        // 对外提供Component的获取方法
        public static ApplicationComponent getAppComponent() {
            return appComponent;
        }
    }
    

    之后在任何地方都可以这样获取实例:

    MyCustomClass myCustomClass = AppController.getAppComponent().getMyCustomClass();
    

方式二:通过Module提供实例(适合无法修改构造的类)

如果你的普通类是第三方类,或者有特殊的初始化逻辑不能用构造注入,就用这种方式:

  1. 在ApplicationModule中添加提供方法
    打开你的ApplicationModule,添加一个@Provides方法来创建并返回MyCustomClass的实例,同时传入它的依赖:

    @Module
    public class ApplicationModule {
        // 假设你已经有提供ApiService的方法
        @Provides
        @Singleton
        ApiService provideApiService() {
            return new Retrofit.Builder()
                    .baseUrl("https://your-api-url.com/")
                    .build()
                    .create(ApiService.class);
        }
    
        // 添加这个方法来提供MyCustomClass实例
        @Provides
        @Singleton
        MyCustomClass provideMyCustomClass(ApiService apiService) {
            // 这里可以写自定义的初始化逻辑
            return new MyCustomClass(apiService);
        }
    }
    
  2. 同样通过Component获取或注入
    之后的步骤和方式一的3一致:在ApplicationComponent添加getMyCustomClass()方法,或者在其他注入类里用@Inject声明即可。

注意事项

  • 确保你要注入的所有依赖(比如ApiService)都是Dagger能识别的:要么有@Inject构造,要么在Module里有对应的@Provides方法。
  • 如果你的普通类需要单例,记得给构造函数或者@Provides方法加上@Singleton注解,和ApplicationComponent的作用域保持一致。

内容的提问来源于stack exchange,提问作者Harmeet Kaur

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:34:55