Spring通过FactoryBean配置Bean

FactoryBean和BeanFactory有什么区别?

摘自网络:
Spring中有两种类型的Bean,一种是普通Bean,另一种是工厂Bean,即FactoryBean,这两种Bean都被容器管理,但工厂Bean跟普通Bean不同。

BeanFactory:需要知道对象的一系列属性(通过XML配置),然后再构造对象,并对对象进行管理,如对象的生命周期,是否单例,以及复合对象(对象有其他对象的引用)的组装(自动装配),对象初始化的一些准备工作,属性注入等等。可以说BeanFactory更像一个公司。

FactoryBean:这个对象更像一个工厂,是专门生产某一类对象,几乎没有管理功能,只是单一的构造对象而已。

注意:
FactoryBean跟普通Bean不同,其返回的对象不是指定类的一个实例,而是该FactoryBean的getObject方法所返回的对象。

应用场景
FactoryBean 通常是用来创建比较复杂的bean,一般的bean 直接用xml配置即可,但如果一个bean的创建过程中涉及到很多其他的bean 和复杂的逻辑,用xml配置比较困难,这时可以考虑用FactoryBean。

FactoryBean接口:

public interface FactoryBean {
    @Nullable
    T getObject() throws Exception;   //返回bean的对象

    @Nullable
    Class getObjectType();         //返回的bean的类型

    default boolean isSingleton() {   //是否为单例
        return true;
    }
}

自定义FactoryBean类来创建实例Bean:

public class CarFactoryBean implements FactoryBean<Car> {

    private String name;

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public boolean isSingleton() {
        return false;
    }

    @Override
    public Car getObject() throws Exception {
        return new Car(name,11);
    }

    @Override
    public Class getObjectType() {
        return Car.class;
    }
}

配置xml文件:

 id="carFactory" class="hello.CarFactoryBean" p:name="一汽大众">
 

注意:

通过FactoryBean来配置Bean的实例
class:指向FactoryBean的全类名
property:配置FactoryBean的属性

单实际返回的实例却是FactoryBean的getObject()方法返回的实例

测试:

  public static void main(String[] args) throws SQLException {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Car car = (Car) applicationContext.getBean("carFactory");
        System.out.println(car);
    }

输出:

Car{name='一汽大众', price=11}

你可能感兴趣的:(SSM框架)