spring BeanFactory实例化过程流水账

因为有很多层,看起来很累,索性先写下来。
看其他部分的时候,其实都离不开new BeanFactory这一步。所以这一部分是所有源码的基础。先当做草稿好了

Spring IOC源码记录
1.通过path 使用resource获得inputStream,进而得到Document对象
2.将resource与BeandefintionReader 注册进入ReaderContext
3.通过BeandefintionDocumentReader 注册ReaderContext 与 Document
3.1 得到DocumentElement , ReaderContext给BeanDefinitionParserDelegate
3.2 使用BeanDefinitionParserDelegate,为所持有的DocumentDefaultsDefinition对象赋予root取得的值
    LazyInit、default-merge、default-autowire、default-dependency-check、default-autowire-candidates、default-init-method、default-destroy-method
3.3 使用DocumentDefaultsDefinition循环遍历整个Document,分别
importBeanDefinitionResource、processAliasRegistration、processBeanDefinition
传递BeanDefinitionParserDelegate

3.3.1  processBeanDefinition:
使用BeanDefinitionParserDelegate调用parseBeanDefinitionElement传递Element,返回BeanDefinitionHolder
3.3.1.1 parseBeanDefinitionElement得到AbstractBeanDefinition
3.3.1.1.1 createBeanDefinition得到AbstractBeanDefinition(GenericBeanDefinition bd = new GenericBeanDefinition(); bd.setBeanClassName(className);)
3.3.1.1.2 AbstractBeanDefinition赋值SCOPE、SINGLETON、ABSTRACT、LAZY_INIT、AUTOWIRE、dependency-check、depends-on、AUTOWIRE_CANDIDATE、primary、init-method、DESTROY_METHOD、FACTORY_METHOD、FACTORY_BEAN
parseMetaElements、parseLookupOverrideSubElements、parseReplacedMethodSubElements、parseConstructorArgElements、parsePropertyElements、parseQualifierElements、setResource、setSource
3.3.1.1.3 generateBeanName name+$child 或者 name+$created  + # 对象转16进制 (没看太懂)
3.3.1.1.4 新建一个BeanDefinitionHolder 赋值beanDefinition、beanName、aliases
3.3.1.2 BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
registry.registerBeanDefinition
DefaultListableBeanFactory.BeanDefinitionNames.add(beanName)
DefaultListableBeanFactory.beanDefinitionMap.put(beanName, beanDefinition);
this.singletonObjects.remove(beanName);
singletonFactories.remove(beanName);
earlySingletonObjects.remove(beanName);
registeredSingletons.remove(beanName);
disposableBeans.remove(beanName);
dependenciesForBeanMap.remove(beanName);
        ----------------------------------------------
        registry.registerAlias
        aliasMap.put(alias, name);
3.3.2  processAliasRegistration

3.3.3  importBeanDefinitionResource



doGetBean

1. 先从缓存取SingletonBean  == 》getSingleton
singletonObjects.get(beanName)
singletonObjects如果为null
earlySingletonObjects.get(beanName)
如果还是null
singletonFactories.get(beanName)
singletonFactory如果不为null
singletonObject = singletonFactory.getObject();
earlySingletonObjects.put(beanName, singletonObject);
singletonFactories.remove(beanName);
2.1 如果缓存中存在sharedInstance
getObjectForBeanInstance
2.1.1 如果不是FactoryBean 则直接返回缓存中的单例bean
2.2.2 如果是FactoryBean,先从factoryBeanObjectCache.get(beanName);
如果得到的是null ,直接强制转换FactoryBean
如果beanDefinitionMap.containsKey(beanName);
则getMergedLocalBeanDefinition(beanName);
2.2.2.1 RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
        如果缓存中存在,直接返回
2.2.2.2 缓存中不存在, bd = beanDefinitionMap.get(beanName); new RootBeanDefinition(bd) 复制一份
缓存mergedBeanDefinitions.put(beanName, mbd);
然后factoryBeanObjectCache.get(beanName);如果缓存取得为空, doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess);
doGetObjectFromFactoryBean包括步骤:object = factory.getObject();最终返回实例

2.2 如果尚未缓存
2.2.1 得到parentBeanFactory 试着getBean 看看是否返回对象
2.2.2 得到getMergedLocalBeanDefinition同上
2.2.3 String[] dependsOn = mbd.getDependsOn();得到所有依赖bean,并先getBean实例化,然后注册依赖bean与被依赖bean
getBean(dependsOnBean);
registerDependentBean(dependsOnBean, beanName);
2.2.3.1 缓存所有依赖bean及其依赖,如果没有依赖new一个LinkedHashSet   dependentBeanMap.put(beanName, dependentBeans);
2.2.3.2 缓存所有被依赖bean dependenciesForBeanMap.put(dependentBeanName, dependenciesForBean);
依赖的缓存结构比较特殊: 如student的bean ,依赖book
则从dependenciesForBeanMap通过student可以取得一个LinkedHashSet,里面包含book及其他依赖
而通过从dependentBeanMap可以取得依赖bean所在的被依赖bean  通过book 可以取得student
二者采用关键字dependent-on

此处面临选择1 singleton , 2 prototype
2.2.3.3 如果是singleton:

2.2.3.3.1 调用getSingleton传递beanName与一个ObjectFactory, 重写createBean方法. 重点描述createBean方法
2.2.3.3.1.1 resolveBeanClass(mbd, beanName);
如果初次加载mbd应该是不存在beanClass的。因此调用doResolveBeanClass(mbd, typesToMatch);typesToMatch即是beanName
接下来调用mbd.resolveBeanClass(getBeanClassLoader());
接下来beanDefintion执行如下:
Class resolvedClass = ClassUtils.forName(className, classLoader);
this.beanClass = resolvedClass;
此处beanDefintion由2.2.2获得, 并缓存了beanClass
2.2.3.3.1.2 接下来mbd.prepareMethodOverrides(); 不是很明白
2.2.3.3.1.3
Object bean = resolveBeforeInstantiation(beanName, mbd);
if (bean != null) {
return bean;
}

此处给bean一个用代理实现的机会, 如果bean 实现了InstantiationAwareBeanPostProcessor接口
此处可以在postProcessBeforeInstantiation, postProcessAfterInitialization 做一些处理

最终执行Object beanInstance = doCreateBean(beanName, mbd, args);并返回bean

2.2.3.3.1.3.1
先应该获得BeanWrapper ,如果没有,创建并缓存, 如果有则取之。
首先factoryBeanInstanceCache.remove(beanName) 通过factoryBeanInstanceCache取得并删除缓存。

2.2.3.3.1.3.2
如果缓存内不存在, 则instanceWrapper = createBeanInstance(beanName, mbd, args);
           2.2.3.3.1.3.2.1
           resolveBeanClass(mbd, beanName);
           2.2.3.3.1.3.2.2
           如果存在factory-method创建对象时,
           instantiateUsingFactoryMethod(beanName, mbd, args);
           autowireConstructor(beanName, mbd, null, null);
           2.2.3.3.1.3.2.3
           如果需要自己实例化
           instantiateBean(beanName, mbd);将Class to Object
           BeanWrapper bw = new BeanWrapperImpl(beanInstance);
           BeanWrapper.defaultEditorsActive = true;
           BeanWrapper.object = object;
BeanFactory.initBeanWrapper(BeanWrapper);
        beanFactory.registerCustomEditors(BeanWrapper);初始化所有CustomerEditors
返回BeanWwrapper
2.2.3.3.1.3.2.4
MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(mbd, beanType, beanName);        
2.2.3.3.1.3.2.5
beanFactory注册一个ObjectFactory,
this.singletonFactories.put(beanName, singletonFactory);
this.earlySingletonObjects.remove(beanName);
this.registeredSingletons.add(beanName);
ObjectFactory内容:
SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference(这个很厉害,AOP的AbstractAutoProxyCreator在此执行初始化)

2.2.3.3.1.3.2.6
populateBean(beanName, mbd, instanceWrapper);
1. InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)
2.mbd 中的autowireMode 类型如果是AUTOWIRE_BY_NAME,autowireByName(beanName, mbd, bw, newPvs);
  mbd 中的autowireMode 类型如果是AUTOWIRE_BY_TYPE,autowireByType(beanName, mbd, bw, newPvs);
3.applyPropertyValues(beanName, mbd, bw, pvs);
2.2.3.3.1.3.2.7
initializeBean(beanName, exposedObject, mbd);
1.invokeAwareMethods(beanName, bean);
((BeanNameAware) bean).setBeanName(beanName);
((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
2.applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
beanProcessor.postProcessBeforeInitialization(result, beanName);
3.invokeInitMethods(beanName, wrappedBean, mbd);
a.继承了InitializingBean的bean,执行afterPropertiesSet
b.实现了init-method方法的,执行invokeCustomInitMethod(beanName, bean, mbd);
ReflectionUtils.makeAccessible(initMethod);
initMethod.invoke(bean);
4.applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
postProcessAfterInitialization(result, beanName);
2.2.3.3.1.3.2.8
没看明白啥意思
2.2.3.3.1.3.2.9
registerDisposableBeanIfNecessary(beanName, bean, mbd);

2.2.3.3.2
bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
处理方法同上: 如果不是FactoryBean则返回,如果是:
factoryBeanObjectCache.get(beanName);
不存在缓存则强制转换FactoryBean factory = (FactoryBean) beanInstance;
最终factory.getObject();并缓存factoryBeanObjectCache.put(beanName, (object != null ? object : NULL_OBJECT));

2.2.3.4 如果是原型:
2.2.3.4.1 beforePrototypeCreation(beanName);
beanFactoy.prototypesCurrentlyInCreation 不为空的情况下取出:
1. String类型。 2 HashSet    
如果为空, 则存放beanName
如果不空, 如果是String, 则新建Set , add 取出的值与当前beanName
如果为Set , 则add beanName
2.2.3.4.2 prototypeInstance = createBean(beanName, mbd, args);
2.2.3.4.1 resolveBeanClass(mbd, beanName); 作用同singleton
2.2.3.4.2 mbd.prepareMethodOverrides(); 准备方法的覆盖, 如果有相同命名的方法,视为重写
2.2.3.4.3 Object bean = resolveBeforeInstantiation(beanName, mbd);同上
2.2.3.4.4 Object beanInstance = doCreateBean(beanName, mbd, args);
2.2.3.4.3 afterPrototypeCreation(beanName);
获取prototypesCurrentlyInCreation 如果为string 则set null
如果是set , 则remove
2.2.3.4.4 bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
同上


2.2.3.5 如果是其他类型,使用ObjectFactory创建bean , 采用Scope缓存bean


猜你喜欢

转载自zouruixin.iteye.com/blog/1595695