BeanFactory和FactoryBean区别

BeanFactory
  • BeanFactory 是 Spring IoC 容器的核心接口,它定义了 IoC 容器的基本功能,如管理应用程序组件之间的依赖关系。BeanFactory 负责实例化、配置和组装 bean。它提供了获取 bean 实例的方法,通常通过 bean 的名称或类型来获取。BeanFactory 是 Spring IoC 容器最底层的实现,提供了最基础的功能,而不涉及到更多的生命周期管理或 AOP 代理的创建等高级特性。XmlBeanFactory 和 DefaultListableBeanFactory 是 BeanFactory 接口的常见实现。
FactoryBean
  • FactoryBean 是 Spring 框架中的一个特殊类型的 bean,它允许你定义创建对象的复杂逻辑,并在 Spring IoC 容器中注册这个逻辑作为一个 bean。FactoryBean 不是用于管理 bean 的容器,而是用于创建特定类型的 bean 实例的工厂。
    当你向 Spring IoC 容器请求一个 FactoryBean 类型的 bean 时,容器实际上会调用 FactoryBean 的 getObject() 方法来获取真正的对象实例,而不是返回 FactoryBean 本身。同时,FactoryBean 的 getObjectType() 方法用于指定由 FactoryBean 创建的对象的类型,而 isSingleton() 方法则用于控制这个对象是否是单例的。
  • 区别:
  1. BeanFactory 是 IoC 容器的核心接口,负责管理应用程序的 bean 实例及其依赖关系。
    FactoryBean 是一种特殊的 bean,它充当了创建其他 bean 实例的工厂。
  2. 你通常不会直接实现 BeanFactory 接口,而是使用其实现类(如 XmlBeanFactory 或 DefaultListableBeanFactory)来创建和管理 IoC 容器。
    但你会实现 FactoryBean 接口,以便定义如何创建和配置特定的 bean 实例。
  3. FactoryBean 提供了更大的灵活性,允许你定义复杂的对象创建逻辑,包括延迟初始化、代理创建等。
    BeanFactory 提供了基本的 IoC 功能,但对于复杂的场景可能不如 FactoryBean 那么灵活。

FactoryBean案例:

  • 实体类
import java.util.Date;

public class Student {
    private Date birth;

    public void setBirth(Date birth) {
        this.birth = birth;
    }

    @Override
    public String toString() {
        return "Student{" +
                "birth=" + birth +
                '}';
    }
}
  • 集成了FactoryBean的DateFactoryBean类
public class DateFactoryBean implements FactoryBean<Date> {
    private String strDate;

    public DateFactoryBean(String strDate) {
        this.strDate = strDate;
    }


    @Override
    public Date getObject() throws Exception {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = simpleDateFormat.parse(strDate);
        return date;
    }

    @Override
    public Class<?> getObjectType() {
        return null;
    }
}
  • spring配置文件
    <bean id="date" class="com.powernode.spring6.bean.DateFactoryBean">
        <constructor-arg index="0" value="1980-10-11"/>
    </bean>

    <bean id="studentBean" class="com.powernode.spring6.bean.Student">
        <property name="birth" ref="date"/>
    </bean>
  • 测试
@Test
    public void testFactoryBean(){
        ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("spring.xml");
        Student studentBean = classPathXmlApplicationContext.getBean("studentBean", Student.class);
        System.out.println(studentBean);
    }

输出结果: Student{birth=Sat Oct 11 00:00:00 CST 1980}

posted @ 2024-05-27 18:17  文采杰出  阅读(2)  评论(0编辑  收藏  举报