java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring BeanFactory和FactoryBean

Spring BeanFactory和FactoryBean的详细对比和解析

作者:程序员从入门到入土

在Spring框架中BeanFactory和FactoryBean虽然名称相似,但功能和角色截然不同,这篇文章主要介绍了Spring BeanFactory和FactoryBean详细对比和解析的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在 Spring 框架中,BeanFactory 和 FactoryBean 虽然名字相似,但它们的角色、职责和使用场景有着本质的区别。简单来说,‌BeanFactory 是管理 Bean 的容器(工厂本身),而 FactoryBean 是一种特殊的 Bean,它用于创建其他 Bean(工厂生产的产品或辅助工具)‌。

以下是两者的详细对比和解析:

1. 核心定义与角色

BeanFactory(IOC 容器)‌

FactoryBean(特殊 Bean)‌

2. 主要区别对比表、

特性BeanFactoryFactoryBean
‌类型‌接口 (Interface)接口 (Interface)
‌所属包‌org.springframework.beans.factory.BeanFactoryorg.springframework.beans.factory.FactoryBean
‌核心职责‌管理所有 Bean 的生命周期、依赖注入、获取 Bean自定义单个或特定类型 Bean 的创建逻辑
‌身份‌‌容器‌ (Container)‌Bean‌ (Component)
‌获取方式‌通过上下文获取容器实例,再调用 getBean()作为普通 Bean 注册到容器中,通过 getBean() 获取其创建的对象
‌默认行为‌不直接作为 Bean 被业务代码使用,而是作为底层支撑默认返回 getObject() 产生的对象,而非 FactoryBean 本身
‌典型场景‌Spring 启动时的核心组件集成 MyBatis (SqlSessionFactoryBean)、AOP 代理对象创建等

3. 深入理解 FactoryBean 的工作机制

FactoryBean 的核心在于它改变了 Spring 获取 Bean 的默认行为。

‌正常 Bean‌:当你请求一个名为 myBean 的 Bean 时,Spring 返回该类的实例。
‌FactoryBean‌:当你请求一个实现了 FactoryBean 接口的 Bean(例如 myFactoryBean)时:
Spring 会先创建 myFactoryBean 的实例。
Spring 检测到它实现了 FactoryBean 接口。
Spring 调用 myFactoryBean.getObject() 方法。
‌最终返回给调用者的是 getObject() 返回的对象,而不是 myFactoryBean 本身。‌
如何获取 FactoryBean 本身?
如果你确实需要获取 FactoryBean 实例本身(而不是它创建的对象),需要在 Bean 名称前加上 & 前缀。

context.getBean(“myFactoryBean”) -> 返回 getObject() 的结果。
context.getBean(“&myFactoryBean”) -> 返回 FactoryBean 实例本身。

4. 代码示例

BeanFactory 的使用(通常由 Spring 内部管理)

// ApplicationContext 内部包含 BeanFactory
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
// 通过 BeanFactory 的功能获取 Bean
MyService service = context.getBean(MyService.class);

FactoryBean 的实现与使用
假设我们需要创建一个复杂的 Connection 对象:

// 1. 定义 FactoryBean
public class ConnectionFactoryBean implements FactoryBean<Connection> {

    @Override
    public Connection getObject() throws Exception {
        // 自定义复杂的创建逻辑
        return DriverManager.getConnection("jdbc:mysql://...", "user", "pass");
    }

    @Override
    public Class<?> getObjectType() {
        return Connection.class;
    }

    @Override
    public boolean isSingleton() {
        return true;
    }
}
<!-- 2. 在配置文件中注册 -->
<bean id="connectionFactory" class="com.example.ConnectionFactoryBean"/>
// 3. 使用
// 获取的是 Connection 对象,而不是 ConnectionFactoryBean 对象
Connection conn = context.getBean("connectionFactory", Connection.class);

// 如果非要获取 FactoryBean 本身
ConnectionFactoryBean factory = context.getBean("&connectionFactory", ConnectionFactoryBean.class);

5. 总结

‌BeanFactory‌ 是 Spring 的‌心脏‌,它负责整个应用上下文中所有 Bean 的管理。它是框架的基础设施。

‌FactoryBean‌ 是 Spring 提供的一种‌扩展机制‌,它允许开发者介入 Bean 的创建过程。它是框架中的一种特殊组件,用于处理那些无法通过简单构造函数或 setter 注入创建的复杂对象。

可以这样比喻:

‌BeanFactory‌ 是整个‌汽车制造厂‌。
‌FactoryBean‌ 是制造厂里的一条‌特殊生产线‌(比如专门定制引擎的生产线)。
当你向制造厂(BeanFactory)请求“引擎”时,它会通过那条特殊生产线(FactoryBean)为你生产出引擎,而不是把生产线本身搬给你。

到此这篇关于Spring BeanFactory和FactoryBean的详细对比和解析的文章就介绍到这了,更多相关Spring BeanFactory和FactoryBean内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文