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

如何使用Dagger2(2.15)在Android模块间注入依赖

多模块Android项目中Dagger 2(v2.15)依赖注入实现方案

我来给你梳理一下在多模块Android项目里用Dagger 2.15实现这些注入需求的具体方案,步骤清晰且符合Dagger的最佳实践:

一、全局依赖配置

首先,所有需要使用Dagger的模块都要添加依赖。在每个模块的build.gradle中加入以下配置:

Android模块(Main App、Module A/B/D)

dependencies {
    implementation 'com.google.dagger:dagger:2.15'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.15'
}

Java模块(Module C)

dependencies {
    implementation 'com.google.dagger:dagger:2.15'
    annotationProcessor 'com.google.dagger:dagger-compiler:2.15'
}

二、分模块实现Dagger组件与模块

1. Java Module C(纯Java模块,提供实例给Main App)

因为是纯Java模块,无需Android相关组件,直接创建Dagger Module提供实例:

@Module
public class ModuleC {
    // 用@Singleton保证全局单例,若不需要可替换为自定义Scope
    @Provides
    @Singleton
    public C provideCInstance() {
        return new C(); // C为你的目标类
    }
}

2. Android Module B(提供实例给Module A)

Module B需要暴露自身实例给Module A,所以要创建对应的Module和Component:

Step 1: 提供实例的Module

@Module
public class ModuleB {
    // 这里用@PerActivity作为示例Scope,你也可以自定义@PerModuleB
    @Provides
    @PerActivity
    public B provideBInstance() {
        return new B(); // B为你的目标类
    }
}

Step 2: 暴露实例的Component接口

// Scope必须与Module中的Scope一致
@PerActivity
@Component(modules = ModuleB.class)
public interface BComponent {
    // 暴露B实例,让依赖此Component的其他组件能获取
    B getB();
}

3. Android Module A(注入Module B,同时暴露给Main App)

Module A的Component需要依赖BComponent,同时提供自身实例给Main App:

Step 1: 提供A实例的Module(依赖B)

@Module
public class ModuleA {
    @Provides
    @Singleton
    public A provideAInstance(B b) {
        // Dagger会自动从BComponent获取B实例注入
        return new A(b); // A为你的目标类,构造方法传入B
    }
}

Step 2: 关联BComponent并暴露A的Component

@Singleton
@Component(modules = ModuleA.class, dependencies = BComponent.class)
public interface AComponent {
    // 暴露A实例给Main App的Component
    A getA();
}

4. Android Module D(提供实例给Main App)

类似Module B,创建Module和Component暴露实例:

@Module
public class ModuleD {
    @Provides
    @Singleton
    public D provideDInstance() {
        return new D(); // D为你的目标类
    }
}

@Singleton
@Component(modules = ModuleD.class)
public interface DComponent {
    // 暴露D实例给Main App
    D getD();
}

5. Main App模块(注入A、C、D)

Main App的Component需要整合所有依赖的组件/模块,并完成注入:

Step 1: 全局AppComponent

@Singleton
@Component(modules = ModuleC.class, dependencies = {AComponent.class, DComponent.class})
public interface AppComponent {
    // 定义注入目标:比如Application、MainActivity
    void inject(MyApplication application);
    void inject(MainActivity mainActivity);
}

Step 2: 在Application中初始化所有组件

public class MyApplication extends Application {
    private AppComponent appComponent;

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化顺序:先初始化被依赖的组件,再初始化依赖它的组件
        BComponent bComponent = DaggerBComponent.create();
        AComponent aComponent = DaggerAComponent.builder()
                .bComponent(bComponent)
                .build();
        DComponent dComponent = DaggerDComponent.create();
        
        // 构建最终的AppComponent
        appComponent = DaggerAppComponent.builder()
                .aComponent(aComponent)
                .dComponent(dComponent)
                .build();
    }

    public AppComponent getAppComponent() {
        return appComponent;
    }
}

Step 3: 在MainActivity中完成注入

public class MainActivity extends AppCompatActivity {
    // 声明需要注入的实例
    @Inject
    A moduleA;
    @Inject
    C moduleC;
    @Inject
    D moduleD;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 执行注入
        ((MyApplication) getApplicationContext()).getAppComponent().inject(this);
        
        // 现在可以直接使用moduleA、moduleC、moduleD了
    }
}

三、关键注意事项

  • Scope匹配:Component的Scope必须与Module中@Provides方法的Scope一致,否则Dagger会抛出编译错误。
  • 模块依赖顺序:在项目的build.gradle中要正确配置模块间的依赖:
    // Main App的build.gradle
    implementation project(':moduleA')
    implementation project(':moduleC')
    implementation project(':moduleD')
    
    // Module A的build.gradle
    implementation project(':moduleB')
    
  • 组件暴露规则:只有在Component中显式声明的实例(如getB()、getA())才能被其他依赖的Component获取,否则无法注入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:53:46