网站首页 > 精选教程 正文
Spring 的工厂方法模式通过 FactoryBean 接口和多种配置方式,将对象创建逻辑抽象为可配置、可扩展的组件。它既是集成复杂第三方库的桥梁,也是实现条件化实例化的核心手段。掌握工厂方法与单例、原型模式的配合使用,能显著提升代码的灵活性和可维护性。
1. Spring 工厂方法模式的核心特点
- 解耦对象创建:将对象创建逻辑封装在工厂方法中,调用方无需关心具体实现。
- 动态实例化:支持通过静态方法、实例方法或 FactoryBean 接口动态生成对象。
- 与容器集成:工厂方法由 Spring IoC 容器调用,可结合依赖注入和生命周期管理。
- 灵活性:通过配置切换实现类(如切换数据源、日志组件)。
2. Spring 版本与源码获取
请看:
https://www.toutiao.com/article/7477754870884336178/
调试技巧:
关键断点位置:
AbstractBeanFactory.createBean() → instantiateBean() →
BeanUtils.instantiateClass()。
观察 FactoryBean 接口实现类(如 SqlSessionFactoryBean)的 getObject() 方法。
3. 源码级实现剖析
FactoryBean 像一个“万能模具”,调用 getObject() 时,模具根据配置“浇铸”出特定对象(如数据库连接工厂)。
// 核心接口:FactoryBean
public interface FactoryBean {
T getObject() throws Exception; // 工厂方法:返回对象实例
Class> getObjectType(); // 返回对象类型
boolean isSingleton(); // 是否单例
}
// 示例:MyBatis 的 SqlSessionFactoryBean
public class SqlSessionFactoryBean implements FactoryBean {
@Override
public SqlSessionFactory getObject() throws Exception {
// 复杂初始化逻辑(如解析 XML、构建 Configuration)
return buildSqlSessionFactory();
}
}
4. 工厂方法的多维度应用
配置方式对比
静态工厂方法:
实例工厂方法:
注解配置:
@Configuration public class AppConfig {
@Bean public Car tesla() {
// 等同于工厂方法
return CarFactory.createTesla();
}
}
FactoryBean 高级用法
@Component
public class RobotFactoryBean implements FactoryBean {
@Override
public Robot getObject() {
return new Robot("AI-9000", true);
}
@Override
public Class> getObjectType() { return Robot.class; }
@Override
public boolean isSingleton() { return true; }
}
注入时区别:
@Autowired Robot robot:注入 Robot 实例。
@Autowired &RobotFactoryBean:注入工厂本身(前缀 & 为 Spring 约定)。
5. 工厂模式 vs 其他创建型模式
场景 | 工厂方法模式 | 抽象工厂模式 | 构造器注入 |
创建单一对象 | 灵活控制实例化逻辑(如条件分支) | 过度设计 | 简单直接 |
创建对象家族 | 需多个工厂类 | 统一接口生成多系列对象(如 UI 组件) | 无法统一管理 |
与 Spring 集成 | 无缝结合 Bean 生命周期 | 可通过工厂接口实现 | 原生支持 |
6. 实际应用场景
复杂对象构建:如 MyBatis 的 SqlSessionFactory、Hibernate 的 SessionFactory。
条件化实例化:根据配置动态选择实现类。
@Bean
@Profile("dev")
public DataSource devDataSource() { /* 内存数据库 */ }
@Bean
@Profile("prod")
public DataSource prodDataSource() { /* 连接池数据库 */ }
第三方库集成:无法直接添加 @Component 注解的类(如遗留代码)。
7. 源码调试与陷阱规避
调试步骤:在
AbstractBeanFactory.getObjectForBeanInstance() 设置断点。观察工厂方法调用链路:FactoryBean.getObject() → 实际对象构造。
常见陷阱:
(1)误用单例:若 FactoryBean.isSingleton()=true,多次调用 getObject() 返回同一实例。
(2)循环依赖:工厂方法中直接注入其他 Bean 可能导致循环依赖(需用 @Lazy 延迟加载)。
8. 性能与最佳实践
优点:隐藏复杂初始化逻辑(如连接池预热、XML 解析)。支持运行时动态选择实现类。
优化建议:对频繁调用的工厂方法结果缓存(结合 @Cacheable)。避免在工厂方法中执行阻塞操作(如远程调用)。
- 上一篇: 一文彻底搞明白工厂方法模式
- 下一篇: JAVA设计模式——工厂方法模式
猜你喜欢
- 2025-03-08 创建型设计模式——工厂模式和抽象工厂模式
- 2025-03-08 谈谈设计模式:建造者模式在jdk中的体现,它和工厂模式区别?
- 2025-03-08 Java开发篇——设计模式(3)面试被问工厂模式?不要怕看这里
- 2025-03-08 1. 工厂模式详解
- 2025-03-08 人人皆可创建“工厂”——工厂模式
- 2025-03-08 简单学设计模式——工厂模式
- 2025-03-08 Java设计模式之工厂模式
- 2025-03-08 Java 设计模式实战系列—工厂模式
- 2025-03-08 JAVA抽象工厂模式
- 2025-03-08 深入解析Java工厂模式及其应用场景
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)