Spring BeanFactory与FactoryBean的区别
1. BeanFactory
以Factory结尾,表示它是一个工厂类(接口),用于管理Bean的一个工厂。在Spring中,BeanFactory是IOC容器的核心接口,它的职责包括:实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。
Spring为我们提供了许多易用的BeanFactory实现比如XmlBeanFactory就是常用的一个,该实现将以XML方式描述组成应用的对象及对象间的依赖关系。
BeanFactory提供的方法及其简单,仅提供了六种方法供客户调用:
- boolean containsBean(String beanName) 判断工厂中是否包含给定名称的bean定义,若有则返回true
- Object getBean(String) 返回给定名称注册的bean实例。根据bean的配置情况,如果是singleton模式将返回一个共享实例,否则将返回一个新建的实例,如果没有找到指定bean,该方法可能会抛出异常
- Object getBean(String, Class) 返回以给定名称注册的bean实例,并转换为给定class类型
- Class getType(String name) 返回给定名称的bean的Class,如果没有找到指定的bean实例,则排除NoSuchBeanDefinitionException异常
- boolean isSingleton(String) 判断给定名称的bean定义是否为单例模式
- String[] getAliases(String name) 返回给定bean名称的所有别名。
2. FactoryBean
以Bean结尾,表示它是一个Bean,不同于普通Bean的是:它是实现了FactoryBean
- Object getObject():返回有FactoryBean创建的Bean实例,如果isSingleton()返回true,则该实例会放到Spring容器的单实例缓存池中。
- boolean isSingleton():确定由FactoryBean创建Bean的作用域是singleton还是prototype.
Class getObjectType():返回FactoryBean创建Bean的类型。
当配置文件中
的class属性配置的实现类是FactoryBean时,通过getBean方法返回的不是FactoryBean本身,而是 FactoryBean.getObject()方法所返回的对象,相当于FactoryBean#getObject()代理了getBean()方法。
如果用户希望获取 FactoryBean的实例,则需要在使用getBean(beanName)方法时显式地在beanName前加上“&”前缀.
一个例子如下:
<bean id="car" class="com.lxm.fb.carFactoryBean">
<property name="carInfo" value=" Benzi"/>
</bean>
import org.springframework.beans.factory.FactoryBean;
public class CarFactoryBean implements FactoryBean{
private String carInfo;
public Stirng getCarInfo() {
return carInfo;
}
public void setCarInfo(String carInfo) {
this.carInfo=carInfo;
}
public Object getObject()throws Exception{
Car car=new Car();
.....
return car;
}
public Class getObjectType(){
return Car.class;
}
public boolean isSingleton() {
return true;
}
}
当调用getBean(“car”)时,Spring通过反射机制发现CarFactoryBean实现了FactoryBean的接口,这时 Sping容器就调用接口方法CarFactoryBean#getObject()返回工厂类创建的对象。如果用户希望获取 CarFactoryBean的实例,则需要在使用getBean(beanName)方法时显式地在beanName前加上“&”前 缀:getBean(“&car”).
还没有评论,来说两句吧...