BeanFactory和FactoryBean的区别
文章目录
一、BeanFactory
1、简介
BeanFactory
是SpringIoc最基本的根容器,提供了IOC的基础功能,是Bean的顶层工厂,包括我们常用的ClassPathXmlApplicationContext
以及Web环境需要的WebApplicationContext
等等都是BeanFactory
的子孙类。负责创建对象、管理对象。
2、核心源码
package org.springframework.beans.factory;
import org.springframework.beans.BeansException;
public interface BeanFactory {
/**
* 获取FactoryBean本身的特殊符号
*/
String FACTORY_BEAN_PREFIX = "&";
/**
* 从SpringIOC的工厂中获取指定名称的Bean
*/
Object getBean(String name) throws BeansException;
/**
* 从SpringIOC的工厂中获取指定名称指定类型的Bean
*/
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
/**
* 是否包含bean
*/
boolean containsBean(String name);
// ......
}
3、继承关系
二、FactoryBean
1、简介
Spring有两种类型的Bean,一种是普通Bean,一种是工厂Bean既FactoryBean。FactoryBean跟普通Bean不同,FactoryBean返回的对象不是指定类的一个实例,而是由FactoryBean的getObject()方法所返回的对象。
FactoryBean本身存活在BeanFactory当中,他本身也是一个工厂,这个工厂作用用于获取由FactoryBean所能创建出来的那个对象(getObject方法),在创建出来对象的时候,可以在这个对象方法的前面或者后面可以额外的执行一些操作,他是实现AOP的一个重要的基石。
2、核心源码
package org.springframework.beans.factory;
public interface FactoryBean<T> {
/**
* 核心!!!返回对象,每次返回的不是FactoryBean本身,而是返回的getObject方法所返回的对象
* 这是和普通Bean最大、最直观的区别。他不返回自己,他返回由自己所创建出来的bean。
*/
T getObject() throws Exception;
/**
* 返回对象的类型
*/
Class<?> getObjectType();
/**
* 是否单例,true:永远返回同一个对象,单例模式,false:每次都创建新对象,原型模式。
*/
boolean isSingleton();
}
三、搞懂&符号
1、简介
&的作用是获取FactoryBean本身,而不是由FactoryBean创建出来的那个对象(getObject方法返回的对象)。因为若是FactoryBean,则返回的不是FactoryBean本身,而是由FactoryBean的getObject()方法所返回的对象。那我们如何获取FactoryBean本身呢?就是在getBean方法里加上&符号。
2、Demo
<bean id="person" class="com.ctw.spring.Person">
<property name="name" value="chentongwei" />
</bean>
<bean id="personFactoryBean" class="com.ctw.spring.PersonFactoryBean">
</bean>
public class Person {
private String name;
// getter/setter
}
import org.springframework.beans.factory.FactoryBean;
public class PersonFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new Person();
}
@Override
public Class getObjectType() {
return Person.class;
}
@Override
public boolean isSingleton() {
return true;
}
}
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class FactoryBeanTest {
public static void main(String[] args){
String url = "com/ctw/spring/config.xml";
ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext(url);
Object person = ac.getBean("personFactoryBean");
PersonFactoryBean personFactoryBean = (PersonFactoryBean) ac.getBean("&personFactoryBean");
System.out.println(person.getClass().getName());
System.out.println(personFactoryBean.getClass().getName());
}
}
输出结果
com.ctw.spring.Person
com.ctw.spring.PersonFactoryBean
不难发现不加&的情况返回的是FactoryBean里的getObject方法所返回的对象,加上&则返回FactoryBean本身。
四、广告
QQ群:458430385
微信公众号