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
相关产品推荐
相关产品推荐

