核心思路是通过spring容器托管bean,结合factorybean、map自动装配、枚举/注解路由及@configuration@bean工厂方法,实现动态策略选择与解耦。

核心思路是让工厂不硬编码 new 实例,而是交由 Spring 容器托管和分发 Bean,再通过策略(如枚举、参数、注解)动态选取对应实现类。这样既保留工厂的统一入口,又享受 Spring 的依赖注入、生命周期管理与配置灵活性。
用 FactoryBean 接口接管对象创建逻辑
FactoryBean 是 Spring 原生支持的“工厂型 Bean”,它本身被容器管理,但真正暴露给其他组件的是它生产的对象。
- 实现 FactoryBean
接口,重写 getObject():在里面根据运行时条件(比如配置项、请求类型)从 Spring 上下文获取目标 Bean - getObjectType() 返回预期的产品类型,确保 @Autowired 按类型注入能匹配成功
- isSingleton() 控制返回对象是否复用——例如多租户场景可设为 false,每次生成隔离实例
- 注册该 FactoryBean 为 @Component 或通过 @Bean 声明,Spring 启动时自动识别并调用 getObject() 初始化产品
用 Map 自动装配实现类集合
Spring 会自动将所有实现某接口的 @Component Bean 收集进 Map,键为 Bean 名称(默认类名首字母小写),这是最轻量的动态路由方式。
- 定义统一接口,如 IOperator,多个实现类标注 @Component("hpDataHandler")、@Component("ppDataHandler")
- 在工厂类中注入 Map
,无需手动注册,Spring 自动填充 - 根据业务参数(如枚举 ImportOptEnum.getCode())查出 key,再 get 对应 handler 调用方法
- 新增一种处理逻辑,只需加个新实现类 + 注册,工厂代码零修改
配合枚举或自定义注解做语义化路由
把“选择哪个实现”这件事从字符串硬编码升级为结构化配置,提升可读性与可维护性。
- 定义枚举 ImportOptEnum,每个值关联一个 handler Bean 名(如 HP_DATA_HANDLE → "hpDataHandler")
- 工厂方法接收枚举或 code,通过枚举的 getName() 获取 Bean 名,再从 ApplicationContext.getBean(name) 拿实例
- 更进一步,可用自定义注解 @HandlerType("HP") 标在实现类上,工厂通过扫描注解+反射建立映射表,支持运行时热插拔
结合 @Configuration + @Bean 构建带逻辑的工厂方法
适合创建过程含条件判断、外部配置依赖或需初始化参数的场景。
- 在 @Configuration 类中写一个 @Bean 方法,参数可自动注入环境变量、配置类、其他服务
- 方法体内根据 profile、配置开关、系统属性等决定返回哪个具体实现类实例
- 该 Bean 可以是单例,也可以是 prototype(用 @Scope("prototype")),满足不同生命周期需求
- 调用方直接 @Autowired 这个工厂 Bean,拿到的就是已按规则选好、已注入依赖的成品对象











