Spring Bean 多实现运行时选择实现注入

最近在业务上遇到需求,需要同时在多种实现情况下,根据参数的不同动态选择不通的实现。

分析需求

  1. 同接口存在N个实现
  2. 默认多数情况只需要一种实现
  3. 部分场景需要根据当前数据选择其中一种实现

技术实现方案

  1. 使用硬编码方式
  2. 通过AOP进行Bean注入
  3. 通过抽象方法进行获取识别

技术尝试

由于项目已存在且使用的spring,技术方案1肯定不是优先选择方案,主要原因为数据的不确定性。

首先对Spring Bean 注入过程进行分析,得到结论如下:

  1. spring Bean 基本在启动时确定
  2. bean注入通过 @Autowired, @Resource 进行注入,但基本在启动时确立
  3. spring 上下文能获取到注册的所有Bean

通过结论,可以看出spring给出了非动态,松耦合的方式进行bean注册、注入,且都在启动过程中完成解析、注册、注入等操作。

最终方案

基础默认Spring 家族绑定关系,最终方案定为:
1. 注册所有实现的bean
2. Spring 上下文工具类动态获取Bean
3. 通过抽象controller 注入HttpServletRequest,并通过httpRequest中Header信息动态获取Bean。
4. 实现方式仅需要调用父Controller提供的获取Bean方法即可,通过泛型指定Bean接口类型。

发表评论

电子邮件地址不会被公开。 必填项已用*标注