当前位置: 首页 > news >正文

@Binds/@IntoMap/@ClassKey的使用

下面是一个完整的 Dagger 多绑定映射(@IntoMap)示例,展示从定义到使用的全过程:

@Binds注解

@Binds:这是 Dagger 中的一个注解,用于声明某个抽象方法的返回类型是接口或抽象类,而方法的参数是其具体实现类!!!

@IntoMap

@IntoMap :将EngineService放入一个Map<Class<?>, CarService>集合中

1. 定义服务接口和实现

// 服务接口
public interface CarService {void start();
}// 引擎服务实现
public class EngineService implements CarService {@Injectpublic EngineService() {}@Overridepublic void start() {System.out.println("Engine started");}
}// 空调服务实现
public class AirConditioningService implements CarService {@Injectpublic AirConditioningService() {}@Overridepublic void start() {System.out.println("AC cooling started");}
}

2. 创建 Dagger 模块

import dagger.Binds;
import dagger.Module;
import dagger.multibindings.ClassKey;
import dagger.multibindings.IntoMap;@Module
public abstract class CarServiceModule {// 将 EngineService 绑定到 Map<Class, CarService>@Binds :EngineServiceCarService的实现类@IntoMap :EngineService放入一个Map<Class<?>, CarService>集合中@ClassKey(EngineService.class) :EngineService.class作为放入Map的键keyabstract CarService bindEngineService(EngineService impl);// 将 AirConditioningService 绑定到 Map@Binds@IntoMap@ClassKey(AirConditioningService.class)abstract CarService bindAirConditioningService(AirConditioningService impl);
}

3. 创建服务管理器

import javax.inject.Inject;
import java.util.Map;public class ServiceManager {private final Map<Class<?>, CarService> serviceMap;@Injectpublic ServiceManager(Map<Class<?>, CarService> serviceMap) {this.serviceMap = serviceMap;System.out.println("ServiceManager initialized with services: " + serviceMap.keySet());}public CarService getService(Class<?> serviceClass) {return serviceMap.get(serviceClass);}
}

4. 创建 Dagger 组件

import dagger.Component;@Component(modules = CarServiceModule.class)
public interface CarComponent {ServiceManager getServiceManager();// 可选:直接获取MapMap<Class<?>, CarService> getServiceMap();
}

5. 使用示例

public class CarApp {public static void main(String[] args) {// 创建Dagger组件CarComponent component = DaggerCarComponent.create();// 获取服务管理器ServiceManager manager = component.getServiceManager();// 使用服务CarService engine = manager.getService(EngineService.class);engine.start(); // 输出: Engine startedCarService ac = manager.getService(AirConditioningService.class);ac.start(); // 输出: AC cooling started// 直接获取MapMap<Class<?>, CarService> serviceMap = component.getServiceMap();System.out.println("Direct map access: " + serviceMap.keySet());}
}

6. 生成的 Dagger 代码 (简化版)

// DaggerCarComponent.java (自动生成)
public final class DaggerCarComponent implements CarComponent {private final Map<Class<?>, Provider<CarService>> serviceMapProvider;private DaggerCarComponent() {this.serviceMapProvider = createServiceMap();}private Map<Class<?>, Provider<CarService>> createServiceMap() {Map<Class<?>, Provider<CarService>> map = new HashMap<>();// 绑定EngineServiceProvider<EngineService> engineProvider = DoubleCheck.provider(EngineService_Factory.create());map.put(EngineService.class, (Provider)engineProvider);// 绑定AirConditioningServiceProvider<AirConditioningService> acProvider = DoubleCheck.provider(AirConditioningService_Factory.create());map.put(AirConditioningService.class, (Provider)acProvider);return Collections.unmodifiableMap(map);}@Overridepublic ServiceManager getServiceManager() {return new ServiceManager(MapProviderFactory.<Class<?>, CarService>create(serviceMapProvider).get());}@Overridepublic Map<Class<?>, CarService> getServiceMap() {return MapProviderFactory.<Class<?>, CarService>create(serviceMapProvider).get();}
}

输出结果

ServiceManager initialized with services: [class EngineService, class AirConditioningService]
Engine started
AC cooling started
Direct map access: {class EngineService=EngineService@1234, class AirConditioningService=AirConditioningService@5678}
http://www.dtcms.com/a/283135.html

相关文章:

  • C++ shared_ptr 底层实现分析
  • uniapp+vue3+鸿蒙系统的开发
  • WD5018 同步整流降压转换器核心特性与应用,电压12V降5V,2A电流输出
  • MySQL学习——面试版
  • ssl相关命令生成证书
  • LangChain面试内容整理-知识点21:LangSmith 调试与监控平台
  • 职业发展:把工作“玩”成一场“自我升级”的游戏
  • 如何解决pip安装报错ModuleNotFoundError: No module named ‘tkinter’问题
  • webpack相关
  • 基于Matlab的四旋翼无人机动力学PID控制仿真
  • 第五届计算机科学与区块链国际学术会议(CCSB 2025)
  • 大模型训练框架对比
  • CTFMisc之隐写基础学习
  • 重学前端007 --- CSS 排版
  • day22 力扣77.组合 力扣216.组合总和III 力扣17.电话号码的字母组合
  • 异常流程进阶 —— 进出异常时的压栈与出栈
  • LVS集群搭建
  • 【Excel】使用vlookup函数快速找出两列数据的差异项
  • 零基础学Vue3组件化开发
  • 使用Python清理Excel中的空行和单元格内部空行:初学者指南
  • Excel处理控件Aspose.Cells教程:使用 Python 在 Excel 中创建甘特图
  • EP02:【NLP 第二弹】自然语言处理数据
  • Oracle 大页配置use_large_pages 参数解析
  • Antd中使用Table集成 react-resizable实现可伸缩列
  • 高性能上位机界面设计范式:C#与C++/C开发调试无缝衔接
  • AR智能巡检:电力运维的数字化变革
  • Raydium CLMM 协议
  • Kotlin比较接口
  • 安全初级作业2
  • HTTP vs HTTPS