最近在业务上遇到需求,需要同时在多种实现情况下,根据参数的不同动态选择不通的实现。
分析需求
- 同接口存在N个实现
- 默认多数情况只需要一种实现
- 部分场景需要根据当前数据选择其中一种实现
技术实现方案
- 使用硬编码方式
- 通过AOP进行Bean注入
- 通过抽象方法进行获取识别
技术尝试
由于项目已存在且使用的spring,技术方案1肯定不是优先选择方案,主要原因为数据的不确定性。
首先对Spring Bean 注入过程进行分析,得到结论如下:
- spring Bean 基本在启动时确定
- bean注入通过 @Autowired, @Resource 进行注入,但基本在启动时确立
- spring 上下文能获取到注册的所有Bean
通过结论,可以看出spring给出了非动态,松耦合的方式进行bean注册、注入,且都在启动过程中完成解析、注册、注入等操作。
最终方案
基础默认Spring 家族绑定关系,最终方案定为:
1. 注册所有实现的bean
2. Spring 上下文工具类动态获取Bean
3. 通过抽象controller 注入HttpServletRequest,并通过httpRequest中Header信息动态获取Bean。
4. 实现方式仅需要调用父Controller提供的获取Bean方法即可,通过泛型指定Bean接口类型。