简单工厂应解耦创建逻辑,交由Spring容器管理;推荐用Map自动注入实现类集合,配合枚举或注解实现类型安全路由,慎用反射动态加载。

简单工厂本身是静态逻辑,与 Spring 的 IoC 理念天然冲突;但可以保留其“统一入口 + 参数路由”的语义,把对象创建权完全交给 Spring 容器,只让工厂做“选择”和“委托”,不 new 实例、不管理生命周期。核心是解耦创建逻辑,复用 Spring 的自动装配与上下文能力。
用 Map 自动注入实现类集合
这是最轻量、最推荐的方式。定义统一接口(如 Handler),所有实现类用 @Service("xxxHandler") 显式指定 Bean 名:
- 支付宝处理器:@Service("alipayHandler") class AlipayHandler implements Handler
- 微信处理器:@Service("wechatHandler") class WechatHandler implements Handler
-
工厂中直接注入:@Autowired private Map
handlerMap; - 根据运行时参数(如 payType = "alipay")拼出 key:"alipayHandler",再 handlerMap.get(key).handle() 即可
- 新增处理器只需加类 + 注解,工厂代码零改动,也无需维护 if-else 或 switch
用 FactoryBean 封装动态选择逻辑
当需要在创建阶段介入(比如按租户隔离实例、带初始化参数、或需捕获异常重试),适合实现 FactoryBean<Handler>:
- 重写 getObject():从 ApplicationContext 中根据条件 getBean("xxxHandler")
- 重写 getObjectType():返回 Handler.class,确保 @Autowired 能按类型注入成功
- 重写 isSingleton():若每次需新实例(如多租户上下文隔离),返回 false
- 该 FactoryBean 自身用 @Component 注册,Spring 启动后会自动识别并调用 getObject() 提供最终对象
配合枚举做类型安全的路由
避免字符串硬编码,提升可读性与编译期检查:
- 定义枚举 PayType,每个值关联对应 Bean 名:ALIPAY("alipayHandler")
- 工厂方法接收 PayType 枚举,调用 context.getBean(enum.getBeanName())
- 也可扩展注解方式:在实现类上加 @HandlerType("ALIPAY"),启动时扫描注册映射表,支持未来热插拔
慎用纯反射+ClassLoader 动态加载
除非真有外部 JAR 热部署需求(如插件化系统),否则不建议在业务层手动 loadClass + defineClass + registerSingleton:
- 绕过 Spring 生命周期(@PostConstruct、AOP、事务代理等失效)
- 破坏依赖注入完整性,需手动处理依赖关系
- 类加载器隔离易引发 NoClassDefFoundError 或 LinkageError
- 调试困难、内存泄漏风险高,运维排查成本陡增

















