FactoryBean简介

网上看了很多关于FactoryBean和BeanFactory的介绍,总感觉说的不够简单、直白,今天用自己的语言来描述下,如果有不对的地方,还请大家指正。

1. FactoryBean和BeanFactory的区别

这点其实是大家最关心或者说最困惑的地方,其实从最简单的字面上来看,BeanFactory是个用来创建Bean的Factory(BeanFactory是bean工厂的顶层接口),它的作用是用来创建Bean的,总之一句话,它是个Factory,一个用来创建Bean的Factory。

而FactoryBean是个Bean,就是一个普普通通简简单单的Bean,只是Spring中所有的Bean都实现了这个Bean或者间接实现了这个Bean。也是一句话,FactoryBean就是一个Bean。

BeanFactory创建出来的每个Bean都是FactoryBean!!!!!!最最简单经典的解释。

2. FactoryBean的由来和背景在Spring中创建Bean的首选方法就是在配置文件中配置bean的信息,让IOC容器创建一个Bean,然后DI。Bean的创建、Bean之间的依赖统统地交给IOC来管,老子懒得管。但是在有些情况下配置也会很复杂,还是自己手写一个Bean最简单,那么怎么手写一个Bean呢?好了,这个时候只要implements FactoryBean就行了,例子如下。

这里要注意一点:getBean()方法返回的是FactoryBean的getObject()方法,返回的是一个Object!!!!!!,不是FactoryBean!!!!!!!

要获得FactoryBean得要用getBean(&name)方法;

 

Car car = (Car) factory.getBean("car");
FactoryBean fb = (FactoryBean) factory.getBean("&car");
try {
Car car2 = (Car)fb.getObject();
car2.getCarInfos();
} catch (Exception e) {
e.printStackTrace();
}

 

package springtest.factorybean;

import org.springframework.beans.factory.FactoryBean;

public class CarFactoryBean implements FactoryBean<Car> {
    private String carInfo;

    @Override
    public Car getObject() throws Exception {
        Car car = new Car();
        String[] infos = carInfo.split(",");
        car.setBrand(infos[0]);
        car.setMaxSpeed(Integer.valueOf(infos[1]));
        car.setPrice(Double.parseDouble(infos[2]));

        return car;
    }

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

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

    public String getCarInfo() {
        return this.carInfo;
    }

    public void setCarInfo(String carInfo) {
        this.carInfo = carInfo;
    }
}

<bean name = "car" class="springtest.factorybean.CarFactoryBean">
<property name="carInfo" value="超级跑车,400,2000000" />
</bean>

public class FactoryBeanTest {
public static void main(String[] args) {
BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");
Car car = (Car) factory.getBean("car");
car.getCarInfos();
}
}

 

posted @ 2018-10-03 15:32  不停的奋斗  阅读(440)  评论(0编辑  收藏  举报