知其然要知其所以然,探索每一个知识点背后的意义,你知道的越多,你不知道的越多,一起学习,一起进步,如果文章感觉对您有用的话,关注、收藏、点赞,有困惑的地方请评论,我们一起交流!
深入分析 BeanFactory 和 FactoryBean 的区别
1. 定义与角色
- 
BeanFactory:
- 角色:IoC(控制反转)容器的核心接口,负责管理和维护Bean的生命周期。
 - 职责:提供Bean的实例化、依赖注入、作用域管理及生命周期控制。
 - 常见实现类 :
DefaultListableBeanFactory,ApplicationContext(如ClassPathXmlApplicationContext)。 
 - 
FactoryBean:
- 角色:用于创建复杂对象的工厂Bean,是Spring中一种特殊的Bean。
 - 职责:自定义Bean的创建逻辑,适用于无法通过简单构造方法或配置生成的Bean。
 - 常见应用 :创建第三方库对象(如 
SqlSessionFactoryBean)、动态代理对象等。 
 
2. 核心方法对比
- 
BeanFactory 的关键方法:
javapublic interface BeanFactory { Object getBean(String name); // 获取Bean实例 <T> T getBean(Class<T> requiredType); // 按类型获取Bean boolean containsBean(String name); // 检查是否存在Bean boolean isSingleton(String name); // 判断是否为单例 // 其他方法... } - 
FactoryBean 的关键方法:
javapublic interface FactoryBean<T> { T getObject(); // 返回由FactoryBean创建的Bean实例 Class<?> getObjectType(); // 返回Bean的类型 boolean isSingleton(); // 是否为单例模式 } 
3. 使用场景与示例
- 
BeanFactory 的典型使用:
- 
管理所有Bean的配置和依赖关系。
 - 
示例代码:
javaBeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml"); UserService userService = factory.getBean("userService", UserService.class); 
 - 
 - 
FactoryBean 的典型使用:
- 
创建需要复杂初始化逻辑的Bean。
 - 
示例:自定义
FactoryBean生成加密工具类:javapublic class EncryptorFactoryBean implements FactoryBean<Encryptor> { @Override public Encryptor getObject() { // 复杂初始化逻辑,如读取密钥、配置加密算法 return new AESEncryptor("secret-key"); } @Override public Class<?> getObjectType() { return Encryptor.class; } @Override public boolean isSingleton() { return true; } } - 
配置XML:
xml<bean id="encryptor" class="com.example.EncryptorFactoryBean" /> - 
获取Bean:
javaEncryptor encryptor = factory.getBean("encryptor", Encryptor.class); // 获取Encryptor实例 FactoryBean<?> factoryBean = factory.getBean("&encryptor", FactoryBean.class); // 获取FactoryBean本身 
 - 
 
4. 核心区别总结
| 维度 | BeanFactory | FactoryBean | 
|---|---|---|
| 角色 | IoC容器,管理所有Bean的生命周期 | 特殊Bean,用于创建复杂对象 | 
| 获取对象 | 直接返回配置或注解定义的Bean | 通过getObject()方法返回自定义创建的Bean | 
| 接口方法 | getBean(), containsBean(), isSingleton() | 
getObject(), getObjectType(), isSingleton() | 
| 使用场景 | 管理所有Bean的基础设施 | 定制化Bean创建(如连接池、动态代理) | 
| 实例获取方式 | factory.getBean("beanName") | 
factory.getBean("&beanName")获取FactoryBean本身 | 
5. 常见问题与解决方案
- 
问题1:混淆BeanFactory和FactoryBean的功能。
- 解决方案:明确BeanFactory是容器,FactoryBean是创建Bean的工具。
 
 - 
问题2:期望获取FactoryBean实例却得到其创建的Bean。
- 
示例 :
java// 错误:获取的是Encryptor实例,而非FactoryBean Encryptor encryptor = factory.getBean("encryptor"); // 正确:添加"&"前缀获取FactoryBean FactoryBean factoryBean = factory.getBean("&encryptor"); 
 - 
 - 
问题3 :未正确实现FactoryBean的
getObjectType()方法导致类型检查失败。- 修复 :确保
getObjectType()返回准确的类型信息。 
 - 修复 :确保
 
6. 高级应用场景
- 
动态代理生成:
- 使用FactoryBean创建AOP代理对象,例如结合
Proxy类生成接口的动态实现。 
javapublic class ServiceProxyFactoryBean implements FactoryBean<MyService> { @Override public MyService getObject() { return (MyService) Proxy.newProxyInstance( getClass().getClassLoader(), new Class[]{MyService.class}, (proxy, method, args) -> { System.out.println("Before method: " + method.getName()); return method.invoke(new MyServiceImpl(), args); }); } // 其他方法实现... } - 使用FactoryBean创建AOP代理对象,例如结合
 - 
延迟初始化:
- 在
getObject()中实现延迟加载逻辑,优化启动性能。 
javapublic class LazyInitFactoryBean implements FactoryBean<ExpensiveBean> { private ExpensiveBean instance; @Override public ExpensiveBean getObject() { if (instance == null) { instance = new ExpensiveBean(); // 延迟初始化 } return instance; } // 其他方法实现... } - 在
 
7. 生命周期管理
- 
BeanFactory:
- 管理Bean的完整生命周期(初始化、使用、销毁)。
 - 支持
InitializingBean、DisposableBean接口及init-method、destroy-method配置。 
 - 
FactoryBean:
- 其自身的生命周期由BeanFactory管理。
 - 创建的Bean实例的生命周期同样由BeanFactory控制,但初始化逻辑在
getObject()中实现。 
 
8. 性能与设计考量
- 
BeanFactory:
- 作为基础容器,其实现(如
DefaultListableBeanFactory)优化了Bean的查找和依赖注入效率。 - 建议使用
ApplicationContext(扩展自BeanFactory),提供更多企业级功能。 
 - 作为基础容器,其实现(如
 - 
FactoryBean:
- 适用于复杂对象的创建,但需注意
getObject()的调用频率,避免重复计算。 - 在单例模式下,确保线程安全,避免状态共享问题。
 
 - 适用于复杂对象的创建,但需注意
 
9. 总结
- BeanFactory是Spring IoC的基石,负责所有Bean的管理和依赖注入。
 - FactoryBean是扩展点,用于定制化Bean的创建过程,尤其适用于复杂初始化场景。
 - 正确区分和使用两者,能有效提升代码的灵活性和可维护性,避免常见的配置错误和逻辑混淆。