private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
/** Set of registered singletons, containing the bean names in registration order */
private final Set<String> registeredSingletons = new LinkedHashSet<String>(256);
/** Names of beans that are currently in creation */
private final Set<String> singletonsCurrentlyInCreation =
Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>(16));
/** Cache of singleton factories: bean name --> ObjectFactory */
private final Map<String, ObjectFactory<?>> singletonFactories = new HashMap<String, ObjectFactory<?>>(16);
/** Cache of early singleton objects: bean name --> bean instance */
private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>(16);
理论上,若allowCircularReferences,我们提前expose单例(尚未populateBean就放入singletonFactories,此时的ObjectFactory实现为调用所有的SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference提早处理bean),若此时
getSingleton并allowEarlyReference就可以从singletonFactories取出ObjectFactory获得earlyReference并放入earlySingletonObjects,那么再次getSingleton就可从earlySingletonObjects获取。
getBean:
1 去除&(FactoryBean前缀),获取alias对应的rawName
2 getSingleton:可能singletonObjects中存在或早期暴露,若获取后返回(FactoryBean特殊处理)
3 当前线程已经在创建此prototypeBean,异常, ThreadLocal< Object> prototypesCurrentlyInCreation (Object可能是String或Set< String>)
4 存在parentBeanFactory且当前beanFactory不含此BeanDefinition,代理到parentBeanFactory的getBean
5 加入alreadyCreated,Set< String> alreadyCreated
6 获取Merge后的BeanDefinition(可能缓存可能当场merge)
7 Map<String, Set< String>> dependentBeanMap (value依赖key),dependenciesForBeanMap(key依赖value),获取dependsOn,若A的dependsOn含B,且dependentBeanMap传入A获取的Set又含B,存在depends-on的循环关系异常 ,否则将
dependsOn的关系放入两Map,并且对dependsOn依次进行getBean
8 若单例:创建ObjectFactory(内部调用createBean)传入getSingleton方法(和上面那个不同),并可能FactoryBean特殊处理
9 若prototype:放入prototypesCurrentlyInCreation,createBean,移出prototypesCurrentlyInCreation,可能FactoryBean特殊处理
10 看来只能Scope取了,BeanDefinition获取scopeName,BeanFactory获取对应Scope,调用Scope.get(name, ObjectFactory), 传入ObjectFactory是为了万一Scope内没有,内部创建并放入Scope,最后可能FactoryBean特殊处理
11 不管上面哪种方式,若传入requiredType(Class)且requiredType不是bean本身的类型或父类型,获取TypeConverter将bean转换为requiredType的对象返回
getSingleton:为上面步骤8的方法
1 singletonObjects获取,取到返回,取不到2
2 beanName不在inCreationCheckExclusions则放入singletonsCurrentlyInCreation,可能失败,比如发生构造器注入的循环依赖
3 ObjectFactory.getObject()即createBean
4 beanName不在inCreationCheckExclusions则移出singletonsCurrentlyInCreation
5 生成了新的单例(ObjectFactory.getObject()没有异常),singletonObjects和registeredSingletons放入,singletonFactories和earlySingletonObjects确保移除
createBean:
1 确定Class,BeanDefinition可能含Class对象或className(此时需确定ClassLoader进行类加载)
2 检查各个MethodOverride内的方法名是否存在于beanClass内,是否有重载
3 resolveBeforeInstantiation:此时可能就返回一个proxy提前返回了,具体:若BeanDefinition表明尚未beforeInstantiationResolved,那么若存在InstantiationAwareBeanPostProcessor且存在targetType,则调用
InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation,若返回对象(可能proxy),则不调用后续的postProcessBeforeInstantiation,且调用各BeanPostProcessor.postProcessAfterInitialization,若有返回对象则设置beforeInstantiationResolved为true
4 doCreateBean
doCreateBean:
1 获取BeanWrapper:若单例从factoryBeanInstanceCache可能能取到FactoryBean的BeanWrapper,不行createBeanInstance创建
2 若BeanDefinition尚未postProcessed,各MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition, postProcessed设为true
3 单例且allowCircularReferences且singletonsCurrentlyInCreation,提前expose,singletonFactories和registeredSingletons放入,earlySingletonObjects移出(本来就不存在)
4 populateBean和initializeBean
5 检查:若提前expose了且当前线程(循环依赖)或其他线程已经获取了(earlySingletonObjects中存在,获取会从singletonFactories中移除并放入earlySingletonObjects),那么若initializeBean未重新生成新的bean对象,则bean指向earlySingletonObjects中已获取的,否则复杂检查
6 对非prototype(单例或Scope)且requiresDestruction(如本身是DisposableBean,AutoCloseable或Closeable,含有destroyMethod, 含有requiresDestruction能返回true的DestructionAwareBeanPostProcessor)的bean,若为单例,放入Map<String, Object> disposableBeans (Object为DisposableBeanAdapter),若为Scope,调用registerDestructionCallback
createBeanInstance:
1 存在factoryMethod, instantiateUsingFactoryMethod
2 传入args为空且BeanDefinition存在resolvedConstructorOrFactoryMethod,则resolved,若constructorArgumentsResolved,则autowireNecessary
3 resolved且autowireNecessary则autowireConstructor,resolved但autowireNecessary为false则instantiateBean
4 存在SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors可能返回一些Constructor 或自动装配模式为Constructor 或存在ConstructorArgumentValues(xml中有< constructor-arg>)或传入args不为空,四种情况都autowireConstructor,否则instantiateBean
instantiateUsingFactoryMethod和autowireConstructor:新建ConstructorResolver并调用相应方法
instantiateBean:调用InstantiationStrategy的instantiate方法
populateBean:
1 InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation, 有一个返回false就方法提前返回
2 autowireByName或者autowireByType
unsatisfiedNonSimpleProperties:找出需要autowire的属性;1排除无写方法的,2 排除ignoredDependencyTypes含有的或ignoredDependencyInterfaces(各种Aware导致不autowire) 3 排除PropertyValues已经含有的(xml内已经依赖注入了)4排除简单属性(如原始类型,String等)
若autowireByName:BeanFactory.getBean(propertyName),并且放入PropertyValues内,并且dependentBeanMap和dependenciesForBeanMap增加依赖关系,getBean取不到就算了。
若autowireByType:调用resolveDependency获取依赖对象并且放入PropertyValues内,两Map加依赖关系
3 获取BeanWrapper中需要依赖检查(排除ignoredDependencyTypes和ignoredDependencyInterfaces,可能缓存)的PropertyDescriptor,调用各InstantiationAwareBeanPostProcessor.postProcessPropertyValues,这可能改变了PropertyValues,若需要依赖检查(none、simple、objects和all,说明非none),判断各PropertyDescriptor代表属性是否在PropertyValues(此时已含显式依赖注入和autowire)内,若不在异常
4 applyPropertyValues:将PropertyValues内属性设置到bean内
initializeBean:
1 invokeAwareMethods:各种Aware的setter方法调用
2 postProcessBeforeInitialization
3 InitializingBean.afterPropertiesSet和initMethod
4 postProcessAfterInitialization
三类循环依赖
prototype: 无法解决,prototypesCurrentlyInCreation 放置当前线程的正创建的beanName的String或Set,重复了异常
单例:
setter注入:已经提前暴露,可以获取到
构造器注入: 无法解决,暴露是在createBeanInstance和populateBean之间,此时还在createBeanInstance内,自己还没有暴露,那么最初从单例缓存取不到,然后试图加入singletonsCurrentlyInCreation时异常
特例:@Bean-即静态或实例工厂方法,和构造器注入类似,自己还没有暴露的情况下要创建factoryBean
特例:@Autowired,类似setter注入,iabpp通过反射实现- populateBean内调用iabpp的postProcessPropertyValues
特例:@RefreshScope-能解决一些本该循环依赖报错的情形,代理bean本身没有依赖,被代理bean虽然有依赖,但其最早生成时间在代理bean的第一次方法调用