beanFactory和factoryBean
beanFactory
beanFactory
是Spring
的一个容器,它是一个接口,spring
通过实现该接口进行bean
的管理。XMLBeanFactory
,DefaultListbaleBeanFactory
,ApplicationContext
等都是其实现。
bean的创建,实例化,初始化,定位,建立对象间的依赖,都是beanFactory
的实现。
factoryBean
factoryBean
本质上也是一个bean
,但它是一个特殊的bean
,因为通过实现该接口能够定制自己的bean
。
源码
public interface FactoryBean<T> {
//从工厂中获取bean【这个方法是FactoryBean的核心】
@Nullable
T getObject() throws Exception;
//获取Bean工厂创建的对象的类型【注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型】
@Nullable
Class<?> getObjectType();
//Bean工厂创建的对象是否是单例模式
default boolean isSingleton() {
return true;
}
}
使用Demo
public class DogImpl implements FactoryBean {
@Override
public Object getObject() throws Exception {
return new Cat();
}
@Override
public Class<?> getObjectType() { //注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型
return Cat.class;
}
}
getObject()方法会返回实现factoryBean
接口的类所产生的对象实例。上栗中,DogImpl
类的getObject()
方法实际返回的Cat
的实例。
getobjectTYype ()方法仅返回getobject ()
方法所返回的对象的类型,如果预先无法确定,则返回null
。 特别注意这个方法主要作用是:该方法返回的类型是在ioc容器中getbean所匹配的类型。通过上述的例子都可以看懂。
isSingleton()返回是否单例。
factoryBean
表现的是一个工厂的职责。 一个Bean A如果实现了FactoryBean接口,那么A就变成了一个工厂,根据A的名称获取到的实际上是工厂调用getObject()
返回的对象,而不是A本身,如果要获取工厂A自身的实例,那么需要在名称前面加上'&'符号。
getObject('beanName')//返回工厂中的实例
getObject('&beanName') //返回工厂本身的实例
FactoryBean使用场景
-
创建AOP的代理对象:
ProxyFactoryBean
,LocalSessionFactoryBean
,TransactionProxyFactoryBean
- Mybatis中的SqlSessionFactoryBean
- Dubbo中的Consumer 也使用到了FactoryBean
网友评论