Spring源码分析-beanFactory
来源:互联网 发布:淘宝魔镜插件 编辑:程序博客网 时间:2024/06/08 18:29
AliasRegistry:定义了对别名的简单增删改操作
public interface AliasRegistry { void registerAlias(String var1, String var2); void removeAlias(String var1); boolean isAlias(String var1); String[] getAliases(String var1);}
SimpleAliasRegistry:使用ConcurrentHashMap实现了AliasRegistry接口:
public class SimpleAliasRegistry implements AliasRegistry { private final Map<String, String> aliasMap = new ConcurrentHashMap(16); public SimpleAliasRegistry() { } ... }
SingletonBeanRegistry :定义对单例的注册及获取
public interface SingletonBeanRegistry { void registerSingleton(String var1, Object var2); Object getSingleton(String var1); boolean containsSingleton(String var1); String[] getSingletonNames(); int getSingletonCount();}
DefaultSingletonBeanRegistry:对SingletonBeanRegistry 接口的实现,同时继承了SimpleAliasRegistry 类。
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { protected static final Object NULL_OBJECT = new Object();//静态不可变对象Object,因为ConcurrentHashMap不能保存null值。 private final Set<String> singletonsCurrentlyInCreation = Collections.newSetFromMap(new ConcurrentHashMap(16));//根据map生成对应结构的set,保存正在创建的单例beanName的set private final Map<String, Object> singletonObjects = new ConcurrentHashMap(64);//保存单例的map private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap(16);//保存单例bean private final Map<String, Object> earlySingletonObjects = new HashMap(16);//缓存从ObjectFactory中获取的bean private final Set<String> registeredSingletons = new LinkedHashSet(64);//保存已经注册的beanName, private boolean singletonsCurrentlyInDestruction = false;//目前是否在销毁单例 private final Map<String, Object> disposableBeans = new LinkedHashMap();//保存只使用一次的bean private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap(16);//bean的包含关系 private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap(64);//bean的依赖关系 private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap(64);//bean的依赖关系 //单例注册的实现 public void registerSingleton(String beanName, Object singletonObject) throws IllegalStateException { Assert.notNull(beanName, "\'beanName\' must not be null"); Map var3 = this.singletonObjects; synchronized(this.singletonObjects) {//对保存单例的map加锁 Object oldObject = this.singletonObjects.get(beanName);//查看对应名字的单例是否存在 if(oldObject != null) {//已经存在,抛出异常 throw new IllegalStateException("Could not register object [" + singletonObject + "] under bean name \'" + beanName + "\': there is already object [" + oldObject + "] bound"); } else {//不存在,增加这个单例对象 this.addSingleton(beanName, singletonObject); } } } //往singletonObjects里面增加单例 protected void addSingleton(String beanName, Object singletonObject) { Map var3 = this.singletonObjects; synchronized(this.singletonObjects) {//加锁 this.singletonObjects.put(beanName, singletonObject != null?singletonObject:NULL_OBJECT);//待增加的singletonObject 为null则增加静态不可变类NULL_OBJECT this.singletonFactories.remove(beanName);//从ObjectFactory中移除beanName this.earlySingletonObjects.remove(beanName);//从earlySingletonObjects中移除beanName this.registeredSingletons.add(beanName);//将beanName保存到保存已经注册的set中 } }//增加对象工厂(工厂bean) protected void addSingletonFactory(String beanName, ObjectFactory<?> singletonFactory) { Assert.notNull(singletonFactory, "Singleton factory must not be null"); Map var3 = this.singletonObjects; synchronized(this.singletonObjects) {//加锁 //判断singletonObjects是否包含这个beanName if(!this.singletonObjects.containsKey(beanName)) { this.singletonFactories.put(beanName, singletonFactory); this.earlySingletonObjects.remove(beanName); this.registeredSingletons.add(beanName);//保存beanName到set中 } } }//获取单例, public Object getSingleton(String beanName) { //获取单例,允许从ObjectFactory中获取 return this.getSingleton(beanName, true); }//先从保存bean对map中获取,没有获取到,则从缓存ObjectFactory获取的bean的map中获取,没有获取到,则从工厂bean获取 protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); //保存单例的map中没有获取到单例, if(singletonObject == null && this.isSingletonCurrentlyInCreation(beanName)) { Map var4 = this.singletonObjects; //对单例map进行加锁 synchronized(this.singletonObjects) { //从缓存ObjectFactory获取的bean的map中获取 singletonObject = this.earlySingletonObjects.get(beanName); //从ObjectFactory获取 if(singletonObject == null && allowEarlyReference) { ObjectFactory singletonFactory = (ObjectFactory)this.singletonFactories.get(beanName); if(singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject);//将正在创建的bean放到早期引用map中 this.singletonFactories.remove(beanName);//从保存共产bean的map中移除这个beanName } } } } return singletonObject != NULL_OBJECT?singletonObject:null; }}
总结bean的增加和获取:
把bean增加到singletonObjects中,从singletonFactories中移除,从earlySingletonObjects中移除,再保存到registeredSingletons中。
BeanFactory:bean的获取和bean的各种属性
public interface BeanFactory { String FACTORY_BEAN_PREFIX = "&"; Object getBean(String var1) throws BeansException; <T> T getBean(String var1, Class<T> var2) throws BeansException; <T> T getBean(Class<T> var1) throws BeansException; Object getBean(String var1, Object... var2) throws BeansException; <T> T getBean(Class<T> var1, Object... var2) throws BeansException; boolean containsBean(String var1); boolean isSingleton(String var1) throws NoSuchBeanDefinitionException; boolean isPrototype(String var1) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String var1, Class<?> var2) throws NoSuchBeanDefinitionException; Class<?> getType(String var1) throws NoSuchBeanDefinitionException; String[] getAliases(String var1);}
HierarchicalBeanFactory :在BeanFactory 的基础上增加工厂层次关系,
public interface HierarchicalBeanFactory extends BeanFactory { BeanFactory getParentBeanFactory(); boolean containsLocalBean(String var1);}
BeanDefinitionRegistry :对BeanDefinition的增删改操作
public interface BeanDefinitionRegistry extends AliasRegistry { void registerBeanDefinition(String var1, BeanDefinition var2) throws BeanDefinitionStoreException; void removeBeanDefinition(String var1) throws NoSuchBeanDefinitionException; BeanDefinition getBeanDefinition(String var1) throws NoSuchBeanDefinitionException; boolean containsBeanDefinition(String var1); String[] getBeanDefinitionNames(); int getBeanDefinitionCount(); boolean isBeanNameInUse(String var1);}
FactoryBeanRegistrySupport :增加对FactoryBean的操作
public abstract class FactoryBeanRegistrySupport extends DefaultSingletonBeanRegistry { private final Map<String, Object> factoryBeanObjectCache = new ConcurrentHashMap(16);//缓存从工厂bean中获取的对象}
ConfigurableBeanFactory :提供配置Factory的各种方法
public interface ConfigurableBeanFactory extends HierarchicalBeanFactory, SingletonBeanRegistry {//bean的属性 String SCOPE_SINGLETON = "singleton"; String SCOPE_PROTOTYPE = "prototype"; void setParentBeanFactory(BeanFactory var1) throws IllegalStateException;//设置父工厂 void setBeanClassLoader(ClassLoader var1);//设置bean的类加载器 void setBeanExpressionResolver(BeanExpressionResolver var1);//设置bean表达式解析器 void setConversionService(ConversionService var1);//设置类型转换器 void addPropertyEditorRegistrar(PropertyEditorRegistrar var1);// 用一个属性编辑注册器(PropertyEditorRegistry)注册一个自定义的属性编辑器(PropertyEditor)的策略接口。 void setTypeConverter(TypeConverter var1);//设置类型转换器 void addBeanPostProcessor(BeanPostProcessor var1);//增加bean后处理器 ...}
ListableBeanFactory :根据各种条件获取bean
public interface ListableBeanFactory extends BeanFactory {<T> Map<String, T> getBeansOfType(Class<T> var1) throws BeansException;//根据类型获取bean ...}
AbstractBeanFactory :继承了FactoryBeanRegistrySupport ,同时实现ConfigurableBeanFactory 接口的方法
public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory { private BeanFactory parentBeanFactory;//父beanFactory private ClassLoader beanClassLoader = ClassUtils.getDefaultClassLoader();//获取类加载器,首选当前线程的类加载器 private ClassLoader tempClassLoader;//临时类加载器 private boolean cacheBeanMetadata = true; private BeanExpressionResolver beanExpressionResolver; private ConversionService conversionService; private final Set<PropertyEditorRegistrar> propertyEditorRegistrars = new LinkedHashSet(4); private TypeConverter typeConverter; private final Map<Class<?>, Class<? extends PropertyEditor>> customEditors = new HashMap(4); private final List<StringValueResolver> embeddedValueResolvers = new LinkedList(); private final List<BeanPostProcessor> beanPostProcessors = new ArrayList();//bean后处理器 private boolean hasInstantiationAwareBeanPostProcessors; private boolean hasDestructionAwareBeanPostProcessors; private final Map<String, Scope> scopes = new HashMap(8); private SecurityContextProvider securityContextProvider; private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap(64); private final Set<String> alreadyCreated = Collections.newSetFromMap(new ConcurrentHashMap(64)); private final ThreadLocal<Object> prototypesCurrentlyInCreation = new NamedThreadLocal("Prototype beans currently in creation");//构造方法设置父BeanFactory public AbstractBeanFactory(BeanFactory parentBeanFactory) { this.parentBeanFactory = parentBeanFactory; } public Object getBean(String name) throws BeansException { return this.doGetBean(name, (Class)null, (Object[])null, false); } public <T> T getBean(String name, Class<T> requiredType) throws BeansException { return this.doGetBean(name, requiredType, (Object[])null, false); }//一系列最核心的getBean方法。非常重要! public Object getBean(String name, Object... args) throws BeansException { return this.doGetBean(name, (Class)null, args, false); } public <T> T getBean(String name, Class<T> requiredType, Object... args) throws BeansException { return this.doGetBean(name, requiredType, args, false); } //获取bean protected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException { final String beanName = this.transformedBeanName(name);//装换beanName Object sharedInstance = this.getSingleton(beanName);//调用父类方法获取beanName对应单例,尝试直接从缓存获取获取singletonFactories中的ObjectFactory中获取 Object bean; if(sharedInstance != null && args == null) { if(this.logger.isDebugEnabled()) { if(this.isSingletonCurrentlyInCreation(beanName)) { this.logger.debug("Returning eagerly cached instance of singleton bean \'" + beanName + "\' that is not fully initialized yet - a consequence of a circular reference"); } else { this.logger.debug("Returning cached instance of singleton bean \'" + beanName + "\'"); } } bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);//bean的实例化,如果是工厂bean,则获取工厂bean的里面的bean } else { if(this.isPrototypeCurrentlyInCreation(beanName)) { throw new BeanCurrentlyInCreationException(beanName); } BeanFactory ex = this.getParentBeanFactory(); if(ex != null && !this.containsBeanDefinition(beanName)) { String var24 = this.originalBeanName(name); if(args != null) { return ex.getBean(var24, args); } return ex.getBean(var24, requiredType); } if(!typeCheckOnly) { this.markBeanAsCreated(beanName); } try { final RootBeanDefinition ex1 = this.getMergedLocalBeanDefinition(beanName); this.checkMergedBeanDefinition(ex1, beanName, args); String[] dependsOn = ex1.getDependsOn(); String[] scopeName; if(dependsOn != null) { scopeName = dependsOn; int scope = dependsOn.length; for(int ex2 = 0; ex2 < scope; ++ex2) { String dependsOnBean = scopeName[ex2]; if(this.isDependent(beanName, dependsOnBean)) { throw new BeanCreationException(ex1.getResourceDescription(), beanName, "Circular depends-on relationship between \'" + beanName + "\' and \'" + dependsOnBean + "\'"); } this.registerDependentBean(dependsOnBean, beanName); this.getBean(dependsOnBean); } } if(ex1.isSingleton()) { sharedInstance = this.getSingleton(beanName, new ObjectFactory() { public Object getObject() throws BeansException { try { return AbstractBeanFactory.this.createBean(beanName, ex1, args); } catch (BeansException var2) { AbstractBeanFactory.this.destroySingleton(beanName); throw var2; } } }); bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, ex1); } else if(ex1.isPrototype()) { scopeName = null; Object var25; try { this.beforePrototypeCreation(beanName); var25 = this.createBean(beanName, ex1, args); } finally { this.afterPrototypeCreation(beanName); } bean = this.getObjectForBeanInstance(var25, name, beanName, ex1); } else { String var26 = ex1.getScope(); Scope var27 = (Scope)this.scopes.get(var26); if(var27 == null) { throw new IllegalStateException("No Scope registered for scope \'" + var26 + "\'"); } try { Object var28 = var27.get(beanName, new ObjectFactory() { public Object getObject() throws BeansException { AbstractBeanFactory.this.beforePrototypeCreation(beanName); Object var1; try { var1 = AbstractBeanFactory.this.createBean(beanName, ex1, args); } finally { AbstractBeanFactory.this.afterPrototypeCreation(beanName); } return var1; } }); bean = this.getObjectForBeanInstance(var28, name, beanName, ex1); } catch (IllegalStateException var21) { throw new BeanCreationException(beanName, "Scope \'" + var26 + "\' is not active for the current thread; " + "consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", var21); } } } catch (BeansException var23) { this.cleanupAfterBeanCreationFailure(beanName); throw var23; } }}
AutowireCapableBeanFactory:提供创建bean,自动注入,初始化以及应用bean的后处理器
public interface AutowireCapableBeanFactory extends BeanFactory { <T> T createBean(Class<T> var1) throws BeansException; void autowireBean(Object var1) throws BeansException; ...}
AbstractAutowireCapableBeanFactory :继承AbstractBeanFactory ,实现AutowireCapableBeanFactory 接口
//创建bean的实现public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory implements AutowireCapableBeanFactory { public <T> T createBean(Class<T> beanClass) throws BeansException { RootBeanDefinition bd = new RootBeanDefinition(beanClass); bd.setScope("prototype"); bd.allowCaching = ClassUtils.isCacheSafe(beanClass, this.getBeanClassLoader()); return this.createBean(beanClass.getName(), bd, (Object[])null); }}
DefaultListableBeanFactory:综合上面所有功能,主要是对bean注册后的处理
- Spring源码分析-beanFactory
- spring源码分析—BeanFactory
- Spring源码分析IOC实现一BeanFactory
- Spring源码解析-beanfactory
- Spring BeanFactory源码解析
- BeanFactory源码分析笔记
- Spring源码分析——BeanFactory和ApplicationContext
- Spring Ioc创建之BeanFactory创建源码分析
- Spring 源码阅读之BeanFactory
- Spring IoC源码之BeanFactory
- spring源码阅读之BeanFactory
- Spring BeanFactory getBean 源码剖析
- spring源码解读:BeanFactory接口
- spring中BeanFactory源码解读
- String源码分析之BeanFactory
- SugarCRM源码分析之BeanFactory
- 【简记】Java Web 内幕——Spring源码(组件分析,BeanFactory源码,Bean创建之前)
- Spring源码分析——BeanFactory体系之接口详细分析
- 斯坦福CS231n Spring 2017开放全部课程视频
- 关于Android Studio新建或打开存在项目过程, building gradle project info进度一直卡住的问题
- SVM之解决线性不可分
- 你必须知道的261个Java语言问题笔记-Java网络编程
- sdut-3102小鑫追女神
- Spring源码分析-beanFactory
- 170811
- 写在SVM之前——凸优化与对偶问题
- 数据库四种隔离级别
- 网易秋招内推——等差数列
- 洛谷 P3861 8月月赛A
- Ubuntu 17.10 一步安装NVIDIA驱动 + CUDA8.0 在GTX1070笔记本上配置深度学习环境
- 网页HTML5--飞机大战小游戏开发--canvas的应用
- 初学acmer--《算法竞赛入门经典》笔记(十)P54-56