Android Dagger2:如何在非Activity/Fragment类中使用依赖注入
嗨,我来帮你搞定这个问题!其实在普通Java类里用Dagger做依赖注入并不复杂,主要有两种常用的方式,我给你一步步讲清楚:
方式一:构造函数注入(推荐)
这是Dagger最推荐的注入方式,只要你的类允许修改构造函数,优先用这个:
给普通类的构造函数添加
@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(); } }在其他已注入类中直接使用
如果这个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(); } }主动获取实例(如果需要单独创建)
要是你需要在任意地方主动获取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提供实例(适合无法修改构造的类)
如果你的普通类是第三方类,或者有特殊的初始化逻辑不能用构造注入,就用这种方式:
在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); } }同样通过Component获取或注入
之后的步骤和方式一的3一致:在ApplicationComponent添加getMyCustomClass()方法,或者在其他注入类里用@Inject声明即可。
注意事项
- 确保你要注入的所有依赖(比如
ApiService)都是Dagger能识别的:要么有@Inject构造,要么在Module里有对应的@Provides方法。 - 如果你的普通类需要单例,记得给构造函数或者
@Provides方法加上@Singleton注解,和ApplicationComponent的作用域保持一致。
内容的提问来源于stack exchange,提问作者Harmeet Kaur

