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

Android多模块项目中如何在Feature Module注入Core Module对象

多模块Android项目复用CoreComponent对象的最优实现方式

核心问题分析

你当前通过FeatureModule includes CoreModule的写法,会导致CoreModule中的对象被多次实例化(若有@Singleton注解的对象,会在Core组件和Feature组件中各生成一个实例),既破坏单例特性又浪费资源。最优方案是通过**组件依赖(Component Dependency)**复用CoreComponent已创建的对象,无需重复实例化,同时满足“无需创建新组件”的需求。

具体实现步骤

1. 给CoreComponent定义暴露接口

在CoreComponent中声明需要提供给Feature模块的对象,明确对外暴露的实例:

// Main Module - CoreComponent.java
@Component(modules = CoreModule.class)
@Singleton // 若CoreModule提供单例对象,需添加该Scope
public interface CoreComponent {
    // 暴露需要注入到Feature模块的对象,示例:UserRepository
    UserRepository userRepository();
    
    // 若需提供Android系统类(如Context),也可暴露
    Context appContext();
}

2. 配置Feature组件依赖CoreComponent

在Feature模块的Component中,通过dependencies属性关联CoreComponent,无需再将CoreModule包含到FeatureModule中:

// Feature Module - FeatureComponent.java
@Component(
    modules = FeatureModule.class,
    dependencies = CoreComponent.class // 依赖已有的CoreComponent
)
@FeatureScope // 自定义Feature模块的Scope,避免与Singleton冲突
public interface FeatureComponent {
    // 声明需要注入的目标类,示例:FeatureActivity
    void inject(FeatureActivity activity);
}

3. 初始化FeatureComponent时传入CoreComponent实例

在Application或Feature模块的启动入口(如FeatureActivity)中,获取已初始化的CoreComponent实例,传入FeatureComponent的构建器:

// 示例:在FeatureActivity中初始化组件
CoreComponent coreComponent = ((MyApplication) getApplication()).getCoreComponent();
FeatureComponent featureComponent = DaggerFeatureComponent.builder()
    .coreComponent(coreComponent)
    .build();
featureComponent.inject(this);

4. 可选优化:简化组件构建流程

通过@Component.Factory替代传统的Builder模式,让组件初始化更简洁:

// CoreComponent添加Factory
@Component(modules = CoreModule.class)
@Singleton
public interface CoreComponent {
    UserRepository userRepository();
    Context appContext();

    @Component.Factory
    interface Factory {
        CoreComponent create(@BindsInstance Context context);
    }
}

// FeatureComponent添加Factory
@Component(modules = FeatureModule.class, dependencies = CoreComponent.class)
@FeatureScope
public interface FeatureComponent {
    void inject(FeatureActivity activity);

    @Component.Factory
    interface Factory {
        FeatureComponent create(CoreComponent coreComponent);
    }
}

方案优势

  • 保证单例一致性:CoreModule中的单例对象仅在CoreComponent中创建一次,Feature模块直接复用实例。
  • 降低模块耦合:Feature模块仅依赖CoreComponent的暴露接口,无需知晓CoreModule的内部实现。
  • 复用现有组件:完全基于已有的CoreComponent实现,无需创建额外冗余组件。

原写法的弊端

你之前的FeatureModule(includes = CoreModule.class)存在以下问题:

  • 破坏单例:CoreModule中的@Singleton对象会在Feature组件中重新实例化。
  • 耦合度高:Feature模块必须依赖CoreModule的内部细节,不利于模块独立维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:30:29