上一篇Spring源码分析-IOC之FactoryBean我们介绍了FactoryBean的使用,以及在ioc中的实现原理,其中实现原理中我们可以发现最终是调用的FactoryBeanRegistrySupport的getObjectFromFactoryBean和doGetObjectFromFactoryBean这个方法。
FactoryBeanRegistrySupport主要是在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能,下面我们来看下具体的源码:
public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry {
//缓存factoryBeans创建的singletong对象
private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap<String, Object>(16);
//获取指定factoryBean中实例化对象的类型
protected Class<?> getTypeForFactoryBean(final FactoryBean<?> factoryBean) {
try {
//此处是JDK的权限控制,主要是操作系统层面的权限
//我们开发中很少用到
if (System.getSecurityManager() != null) {
return AccessController.doPrivileged(new PrivilegedAction<Class<?>>() {
@Override
public Class<?> run() {
return factoryBean.getObjectType();
}
}, getAccessControlContext());
}
else {
return factoryBean.getObjectType();
}
}
catch (Throwable ex) {
return null;
}
}
//从缓存中获取指定的beanName的对象如果是NULL_OBJECT则返回null
protected Object getCachedObjectForFactoryBean(String beanName) {
Object object = this.factoryBeanObjectCache.get(beanName);
return (object != NULL_OBJECT ? object : null);
}
//从指定的FactoryBean中获得给定beanName的实例对象
protected Object getObjectFromFactoryBean(FactoryBean<?> factory, String beanName, boolean shouldPostProcess) {
//判断工厂是否是单例,以及单例缓存中是否有beanName
if (factory.isSingleton() && containsSingleton(beanName)) {
//单例缓存加上同步快防止并发
synchronized (getSingletonMutex()) {
//判断factoryBean中是否有指定的beanName
Object object = this.factoryBeanObjectCache.get(beanName);
if (object == null) {
//如果缓存中没有,通过factoryBean获取对象
object = doGetObjectFromFactoryBean(factory, beanName);
//再次从缓存中获取对象
//如果存在则赋值给object对象
Object alreadyThere = this.factoryBeanObjectCache.get(beanName);
if (alreadyThere != null) {
object = alreadyThere;
}
//不存在的话则获取,并存放到缓存池中
else {
if (object != null && shouldPostProcess) {
try {
//此获取对象的方法一般有子类实现
object = postProcessObjectFromFactoryBean(object, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(beanName,
"Post-processing of FactoryBean's singleton object failed", ex);
}
}
//将对象存放到缓存中
this.factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT));
}
}
//返回对象,如果是空对象的话则返回null
return (object != NULL_OBJECT ? object : null);
}
}
else {
//通过factoryBean获取对象
Object object = doGetObjectFromFactoryBean(factory, beanName);
if (object != null && shouldPostProcess) {
try {
//此获取对象的方法一般有子类实现
object = postProcessObjectFromFactoryBean(object, beanName);
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "Post-processing of FactoryBean's object failed", ex);
}
}
//返回对象
return object;
}
}
//通过factoryBean获取对象
private Object doGetObjectFromFactoryBean(final FactoryBean<?> factory, final String beanName)
throws BeanCreationException {
Object object;
try {
//此处是JDK的权限控制,主要是操作系统层面的权限
//我们开发中很少用到
if (System.getSecurityManager() != null) {
AccessControlContext acc = getAccessControlContext();
try {
object = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
@Override
public Object run() throws Exception {
return factory.getObject();
}
}, acc);
}
catch (PrivilegedActionException pae) {
throw pae.getException();
}
}
else {
//factoryBean直接获取对象,上一篇我们可以看到具体入口,怎么一步步进来
object = factory.getObject();
}
}
catch (FactoryBeanNotInitializedException ex) {
throw new BeanCurrentlyInCreationException(beanName, ex.toString());
}
catch (Throwable ex) {
throw new BeanCreationException(beanName, "FactoryBean threw exception on object creation", ex);
}
// 不允许对象为空,或者正在创建
if (object == null && isSingletonCurrentlyInCreation(beanName)) {
throw new BeanCurrentlyInCreationException(
beanName, "FactoryBean which is currently in creation returned null from getObject");
}
return object;
}
//此方法一般由子类重写
protected Object postProcessObjectFromFactoryBean(Object object, String beanName) throws BeansException {
return object;
}
//获取指定名称的factoryBean,如果该实例是factoryBean的话,否则报错
protected FactoryBean<?> getFactoryBean(String beanName, Object beanInstance) throws BeansException {
if (!(beanInstance instanceof FactoryBean)) {
throw new BeanCreationException(beanName,
"Bean instance of type [" + beanInstance.getClass() + "] is not a FactoryBean");
}
return (FactoryBean<?>) beanInstance;
}
//移除指定的单例对象
@Override
protected void removeSingleton(String beanName) {
super.removeSingleton(beanName);
this.factoryBeanObjectCache.remove(beanName);
}
//权限管理,系统层面
protected AccessControlContext getAccessControlContext() {
return AccessController.getContext();
}
}
以上就是FactoryBeanRegistrySupport的源代码,大家可以根据源码以及上一篇的例子分析,有什么问题可以给我留言.