相同点:
在 Spring 中,BeanFactory 和 FactoryBean 都是用来创建 bean 对象的。
不同点:
BeanFactory 也就是我们说的 “bean 工厂”, 它负责创建对象,装配对象,配置对象,并且管理这些对象的整个生命周期。这种将对象的创建管理的控制权交给 Spring 容器进行管理的行为,我们称之为 IOC(控制反转),所以 BeanFactory 也称为 Spring 的 IOC 容器。
使用 BeanFactory 创建 bean 对象的时候,必须要遵循严格的生命周期(不了解的同学可以看这篇:
Spring bean 的生命周期是怎样的?),是一套完整的标准化流程。而如果不想走这么多复杂流程,想简单的自定义某个类的创建过程,并且还要将创建出来的对象交给 Spring 来进行管理,那么就需要实现 FactoryBean 接口了。
FactoryBean 是一个能生产或者修饰对象生成的工厂 Bean ,它的实现与设计模式中的工厂模式和修饰器模式类似。
FactoryBean 接口中方法如下:
public interface FactoryBean<T> {
/**
* 获取一个泛型对象,内部可以自定义创建对象的过程(如:直接 new 一个对象)
*/
T getObject() throws Exception;
/**
* 获取返回对象的类型
*/
Class<?> getObjectType();
/**
* 是否是单例
*/
boolean isSingleton();
}
对于实现了 FactoryBean 接口的 bean,通过 getBean(String factoryBean) 方法获取到的并不是此 FactoryBean 的实例对象,而是 FactoryBean 中 getObject() 方法返回的实例对象,如果想要获取 FactoryBean 的实例对象,需要在 factoryBean 前边加上一个“&”字符。
如下示例:
public class MyFactoryBean implements FactoryBean<User> {
@Override
public User getObject() throws Exception {
return new User();
}
@Override
public Class<?> getObjectType() {
return User.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
当通过如下代码获取对象时:
ApplicationContext context = new AnnotationConfigApplicationContext(MyFactoryBean.class);
Object bean1 = context.getBean("myFactoryBean");
Object bean2 = context.getBean("&myFactoryBean");
System.out.println(bean1);
System.out.println(bean2);
输出结果为:
***.User@770a6fd4
***.MyFactoryBean@4ab97fbd