用伪代码梳理spring源码

1、第一个spring demo

BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml"));
// 1. new ClassPathResource("beanFactoryTest.xml")
    |-- 配置文件封装 
        |-- interface InputStreamSource  
            |-- InputStream getInputStream();
        |-- interface Resource extends InputStreamSource 
            |-- boolean exists(); // 存在性
            |-- boolean isReadable(); // 可读性
            |-- boolean isOpen(); // 是否处于打开状态
            |-- URL getURL(); // 
            |-- URI getURI();
            |-- File getFile();
            |-- long lastModified();
            |-- Resource createRelative(String relitivePath);
            |-- String getFileName();
            |-- String getDescription();
        |-- ClassPathResource implements Resource {
                @Override
                InputStream getInputStream() {
                    if (this.clazz != null){
                        is = this.clazz.getResourceAsStream(this.path);
                    } else {
                        is = this.classLoader.getResourceAsStream(this.path);
                    }
                }
            }
        |-- FileSystemResource implements Resource {
                @Override
                InputStream getInputStream() {
                    return new FileInputStream(this.file);
                }
            }
        ...

2、XmlBeanFactory跟踪

// 2. new XmlBeanFactory(Resource resource)        
|-- 2.1 XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
}
|-- 2.1 XmlBeanFactory(Resource resource, BeanFactory parentFactory) throws BeansException {
super(parentFactory); // parentFactory为父类BeanFactory,用于factory合并,可以为空
this.reader.loadBeanDefinitions(resource); // XmlBeanDefinitionReader reader;
}
|-- 2.1.1 super(parentFactory) 
|-- class AbstractAutowrieCapableBeanFactory
|-- public AbstractAutowrieCapableBeanFactory(){
super();
// 忽略给定接口的自动装配
ignoreDependencyInterface(BeanNameAware.class); 
ignoreDependencyInterface(BeanFactoryAware.class);
ignoreDependencyInterface(BeanClassLoaderAware.class);
}
|-- 2.1.2 this.reader.loadBeanDefinitions(resource)
|-- class XmlBeanDefinitionReader
|-- int loadBeanDefinitions(Resource resource){
return loadBeanDefinitions(new EncodedResource(resource));
}
|-- EncodedResource(Resource resource){
this.resource = resource;
}
Reader getReader(){
if (this.encoding != null){
return new InputStreamReader(this.resource.getInputStream(), this.encoding);
} else {
return new InputStreamReader(this.resource.getInputStream());
}
}
|-- int loadBeanDefinitions(EncodedResource encodedResource) {
...
// 通过属性来记录已经加载的资源 this.resourceCurrentBeingLoaded -> new ThreadLocal<Set<EncodedResource>>;
Set<EncodedResource> currentResources = this.resourceCurrentBeingLoaded.get();
if (currentResource == null) {
currentResources = new HashSet<EncodedResource>(4);
this.resourceCurrentBeingLoaded.set(currentResources);
}
// 
if (!currentResource.add(currentResource)){
throw e;
}
try {
InputStream inputStream = encodedResource.getResource().getInputStream();
org.xml.sax.InputSource inputSource = new org.xml.sax.InputSource();
// 设置编码
if (encodedResource.getEncoding() != null) {
inputSource.setEncoding(encodedResource.getEncoding());
}
// 真正进入业务逻辑处理
return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
} catch(e){
...
} finally {
...
}
}
|-- doLoadBeanDefinitions(inputSource, encodedResource.getResource())
|-- int doLoadBeanDefinitions(InputSource inputSource, Resource resource){
try {
// 获取xml文件验证模式
int validationModel = getValidationModeForResource(resource);
// 加载xml文件得到对应的Document
Document doc = this.documentLoader.loadDocument(
    inputSource, getEntityResolver(), this.errorHandler, validationModel, isNamespaceAware());
// 根据返回的Document对象注册Bean信息
return registerBeanDefinitions(doc, resource);
} catch (e){
...
}
}
|-- 2.1.2.1 获取xml文件验证模式
|-- DTD
<? xml version="1.0" encodind="UTF-8">
<!DOCTYPE beans PUBLIC "-//spring//DTD BEAN 2.0//EN" "http://www.Springframework.org/dtd/Spring-beans-2.0.dtd">
<beans>
...
</beans>
<!-- Spring-beans-2.0.dtd -->
<!ELEMENT beans (
description?,
(import | alias | bean)*
)>
... ...
|-- XSD
<? xml version="1.0" encodind="UTF-8">    
<beans xlmns="..." 
xlmns:xsi="..." 
xlmns:schemaLocation=".../Spring-beans.xsd">
... ...
</beans>
<!-- Spring-beans.xsd -->
<xsd:schema xlmns="..." xlmns:xsd="..." targetNamespace="...">
<xsd:import namespace="..."/>
<xsd:annotation>
    ...
</xsd:annotation>
</xsd:schema>
|-- getValidationModeForResource(resource)
|-- int getValidationModeForResource(Resource resource) {
    int validationModeToUse = getValidationMode();
    // 如果手动指定了验证模式则使用指定的验证模式
    if (validationModeToUse != VALIDATION_AUTO) {
        return validationModeToUse;
    }
    // 如果未指定则使用自动检测
    int detectedMode = dectectValidationMode(resource);
    if (detectedMode != null) {
        return detectedMode;
    }
    return VALIDATION_XSD;
}
|-- int dectectValidationMode (Resource resource) {
    if (resource.isOpen()) {
        throw e;
    }
    InputStream inputStream;
    try {
        inputStream = resource.getInputStream();
    } catch(e){
        throw e;
    }
    try {
        return this.validationModeDelector.detectValidationMode(inputStream);
    } catch(e){
        throw e;
    }
}
|-- int XmlValidationModeDetector.detectValidationMode(InputStream inputStream) {
    BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
    try {
        boolean isDtdValidated = false;
        String content;
        while ((content = reader.readLine())!= null){
            content = consumeCommentTokens(content);
            // 空行或者注释略过
            if (this.inComment || !StringUtils.hasText(content)){
                continue
            }
            if (hasDoctype(content)) {
                isDtdValidated = true;
                break;
            }
            // 读取到<跳出
            if (hasOpeningTag(content)) {
                break;
            }
        }
        return (isDtdValidated ? VALIDATION_DTD : VALIDATION_XSD);
    } catch (e){
        throw e;
    } finally {
        reader.close();
    }
}
boolean hasDoctype(String content){
    return (content.indexOf(DOCTYPE) > -1);
}
|-- 2.1.2.2 获取Document 
|-- this.documentLoader.loadDocument(inputSource, getEntityResolver(), this.errorHandler, validationModel, isNamespaceAware())
|-- DefaultDocumentLoader.loadDocument(InputSource inputSource, EntityResolver entityResolver, ErrorHandler errorHandler, int validationModel, boolean namespaceAware) {
    DocumentBuilderFactory factory = createDocumentBuilderFactory(validationModel, namespaceAware);
    DocumentBuilder builder = createDocumentBuilder(factory, entityResolver, errorHandler);
    return builder.parse(inputSource);
}
|-- EntityResolver // 外部实体
|-- InputSource resolveEntity(String publicId, String systemId)
<!-- spring-beans.xsd -->
<beans xsi:schemaLocation="http://www.Springframework.org/schema/beans http://www.Springframework.org/schema/beans/Spring-beans.xsd">
... ...
</beans>
--> 
    publicId: null,
    systemId: http://www.Springframework.org/schema/beans/Spring-beans.xsd
<!-- spring-beans-2.0.dtd -->
<!DOCTYPE beans PUBLIC "-//Spring//DTD BEAN 2.0//EN" "http://www.Springframework.org/dtd/Spring-beans-2.0.dtd">
<beans>
... ... 
</beans>
--> 
    publicId: -//Spring//DTD BEAN 2.0//EN,
    systemId: http://www.Springframework.org/dtd/Spring-beans-2.0.dtd
|-- getEntityResolver() -> DelegatingEntityResolver
|-- InputSource resolveEntity(String publicId, String systemId) throws e{
        if (systemId != null) {
            if (systemId.endsWith(DTD_SUFFIX)){
                // 如果是dtd
                return this.dtdResolver.resolveEntity(publicId, systemId);
            } else if(systemId.endsWith(XSD_SUFFIX)) {
                // 通过调用META-INF/Spring.schemas解析
                return this.schemaResolver.resolveEntity(publicId, systemId);
            }
        }
        return null;
    }
|-- BeansDtdResolver 
    |-- InputSource resolveEntity(String publicId, String systemId) {
            // DTD_EXTENSION=".dtd"
            if (systemId != null && systemId.endsWith(DTD_EXTENSION)){
                int lastPathSeparator = systemId.lastIndexOf("/");
                for (String DTD_NAME : DTD_NAMES) {
                    // DTD_NAMES={"Spring-beans-2.0","Spring-beans"}
                    int dtdNameStart = systemId.indexOf(DTD_NAME);
                    if (dtdNameStart > lastPathSeparator) {
                        String dtdFile = systemId.substring(lastPathSeparator);
                        try {
                            Resource resource = new ClassPathReource(dtdFile, getClass());
                            InputSource source = new InputSource(resource.getInputStream());
                            source.setPulicId(publicId);
                            source.setSystemId(systemId);
                            return source;
                        } catch (e) {
                            throw e;
                        }
                    }
                }
            }
            return null;
        }
|-- 2.1.2.3 解析及注册BeanDefinitions
|-- registerBeanDefinitions(doc, resource)
|-- XmlBeanDefinitionReader {
    public int registerBeanDefinitions(Document doc, Resource resource) {
        // 使用默认的DefaultBeanDefinitionDocumentReader实例化BeanDefinitionDocumentReader
        BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
        // 将环境变量设置其中
        documentReader.setEnvironment(this.getEnvironment());
        // 在实例化BeanDefinitionDocumentReader时会将BeanDefinionRegistry传入,默认使用继承自DefaultListableBeanFactory的子类
        // 记录统计前BeanDefiniton的加载个数
        int countBefore = getRegistry().getBeanDefinitionCount();
        // 加载及注册bean
        documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
        // 记录本次加载的BeanDefinition个数
        return getRegistry().getBeanDefinitionCount() - countBefore;
    }
    
    public int registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
        this.readerContext = readerContext;
        Element root = doc.getElement();
        doRegisterBeanDefinitions(root);
    }
    
    // 核心方法
    protected void doRegisterBeanDefinitions(Element root){
        // 处理profile
        /**
         * <!-- spring.xml -->
         * <beans profiles="dev"> ... </beans>
         * <beans profiles="test"> ... </beans>
         * <beans profiles="prod"> ... </beans>
         * <!-- web.xml -->
         * <context-param> 
         *     <param-name>Spring.profiles.active</param-name>
         *     <param-value>dev|test|prod</param-value>
         * </>
         */
        String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
        if (StringUtils.hasText(profileSpec)) {
            String[] specfiedProfiles = StringUtils.tokenizedToStringArray(profileSpec, ",");
            if (!this.environment.acceptsProfiles(specfiedProfiles)) {
                return;
            }
        }
        // 专门处理解析
        BeanDefinitionParserDelegate parent = this.delegate;
        this.delegate = createHelper(readerContext, root, parent);
        // begin
        preProcessXml(root); // 钩子方法
        parseBeanDefinitions(root, this.delegate);
        postProcessXml(root); // 钩子方法
        // end
        this.delegate = parent;
    }
    
    // 专门处理解析
    /**
     * 默认标签:<bean id="test" class="test.TestBean"/>
     * 自定义标签:<tx:annotation-driven/>
     */
    protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
        // 对beans的处理 
        if (delegate.isDefaultNamespace(root)) {
            NodeList nl = root.getChildNodes();
            for (int i = 0; i < nl.length(); i++) {
                Node node = nl.item(i);
                if (node instanceof Element) {
                    Element ele = (Element) node;
                    // 对bean的处理
                    parseDefaultElement(ele, delegate);
                } else {
                    // 对bean的处理
                    delegate.parseCustomElement(ele);
                }
            }
        } else {
            // 对bean的处理
            delegate.parseCustomElement(ele);
        }
    }
}

3、默认标签的解析

|-- 3 默认标签的解析
|-- private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
// 对import标签处理
if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)){
    importBeanDefinitionResource(ele);
}
// 对alias标签处理
else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)){
    processAliasRegistration(ele);
}
// 对bean标签处理
else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)){
    processBeanDefinition(ele, delegate);
}
// 对beans标签处理
else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)){
    doRegisterBeanDefinitions(ele);
}
}
|-- 3.1.1 对beans标签处理
|-- protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
    // 委托BeanDefinitionParserDelegate类解析,bdHolder实例包含class、name、id、alias之类的属性
    BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
    if (bdHolder != null) {
        // bdHolder不为空情况下,若存在默认标签的子节点下再有自定义属性,还需要再次注册
        bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
        try {
            // 注册操作委托BeanDefinitionReaderUtils.registerBeanDefinition方法
            BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
        } catch (e) {
            throw e;
        }
        // 发出响应事件,通知想关的监听器,这个bean已经加载完成了
        getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
    }
}
|-- BeanDefinitionParserDelegate.parseBeanDefinitionElement(Element ele) {
    return parseBeanDefinitionElement(ele, null);
}
parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) {
    // 解析id属性
    String id = ele.getAttribute(ID_ATTRIBUTE);
    // 解析name属性
    String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);
    // 分割name属性
    List<String> aliases = new ArrayList<String>();
    if (StringUtils.hasLength(aliases)) {
        String[] nameArr = StringUtils.tokenizedToStringArray(nameAttr, ",");
        aliases.addAll(nameArr);
    }
    
    String beanName = id;
    if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {
        beanName = aliases.remove(0); //??
    }
    if (containingBean == null) {
        checkNameUniqueness(beanName, aliases, ele);
    }
    // 进一步解析其他所有属性并统一封装至GenericBeanDefinition
    AbstractBeanparseBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);
    if (beanDefinition != null) {
        if (!StringUtils.hasText(beanName)) {
            // 未指定beanName,使用默认规则为此bean生成beanName
            if (containingBean != null) {
                // 不存在name
                beanName = BeanDefinitionReaderUtils.generateBeanName(beanDefinition, this.readerContext.getRegistry(), true);
            } else {
                beanName = this.readerContext.generateBeanName(beanDefinition);
                String beanClassName = beanDefinition.getBeanClassName();
                if (beanClassName != null && beanName.startsWith(beanClassName) && beanName.length() > beanClassName.length() 
                    && !this.readerContext.getRegistry().IsBeanNameInUse(beanClassName)) {
                        aliases.add(beanClassName);
                }
            }
        }
        // 将获取到的信息封装到BeanDefinitionHolder中    
        String[] aliasesArray = StringUtils.toStringArray(aliases);
        return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);
    }
    return null;
}
// 进一步解析其他所有属性并统一封装至GenericBeanDefinition
AbstractBeanparseBeanDefinition parseBeanDefinitionElement(Element ele, String beanName, BeanDefinition containingBean) {
    try {
        this.parseState.push(new BeanEntry(beanName));
        String className = null;
        // 解析class属性
        if (ele.hasAttribute(CLASS_ATTRIBUTE)) {
            className = ele.getAttribute(CLASS_ATTRIBUTE).trim();
        }
        // 解析parent属性
        String parent = null;
        if (ele.hasAttribute(PARENT_ATTRIBUTE)) {
            parent = ele.getAttribute(PARENT_ATTRIBUTE).trim();
        }
        // 创建用于属性承载的BeanDefinition
        AbstractBeanDefinition bd = createBeanDefinition(className, parent);
        
        // 硬编码解析默认的bean属性
        parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);
        // 提取description
        bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));
        
        // 解析元数据
        parseMetaElements(ele, bd);
        // 解析lookup-method
        parseLookupOverriedSubElements(ele, bd.getMethodOverries());
        // 解析replacted-method属性
        parseReplactedMethodSubElements(ele, bd.getMethodOverries());
        
        // 解析构造函数参数
        parseConstructorArgElements(ele, bd);
        // 解析property子元素
        parsePropertyElements(ele, bd);
        // 解析qualifier子元素
        parseQualifierElements(ele, bd);
        
        bd.setResource(this.readerContext.getResource());
        bd.setSource(extractSource(ele));
        return bd;
    } catch (e) {
        throw e;
    } finally {
        this.parseState.pop();
    }
    return null;
}
// 创建用于属性承载的BeanDefinition
protected AbstractBeanDefinition createBeanDefinition(String className, String parentName){
    return BeanDefinitionReaderUtils.createBeanDefinition(parentName, className, this.readerContext.getBeanClassLoader());
}
// BeanDefinitionReaderUtils-> createBeanDefinition
public static AbstractBeanDefinition createBeanDefinition(String parentName, String className, ClassLoader classloader) {
    GenericBeanDefinition bd = new GenericBeanDefinition();
    // parentName可能为空
    bd.setParentName(parentName);
    if (className != null) {
        if (classLoader != null) {
            bd.setBeanClass(ClassUtil.forName(className, classLoader));
        } else {
            bd.setBeanClassName(className);
        }
    }
    return bd;
}
// 硬编码解析默认的bean属性
public AbstractBeanDefinition parseBeanDefinitionAttributes(Element ele, String beanName, BeanDefinition containingBean, AbstractBeanDefinition bd) {
    // 解析scope属性
    // 解析singleton属性
    bd.setScope(ele.getAttribute(SCOPE_ATTRIBUTE) || ele.getAttribute(SINGLETON_ATTRIBUTE) || containingBean.getScope());
    // 解析abstract属性
    bd.setAbstract(ele.getAttribute(ABSTRACT_ATTRIBUTE));
    // 解析lazy-init属性
    bd.setLazyInit(lazy-init);
    // 解析autowire属性
    // 解析dependency-check属性
    // 解析dependency-on属性
    // 解析autowire-candidate属性
    // 解析primary属性
    // 解析init-method属性
    // 解析detory-method属性
    // 解析factory-method属性
    // 解析factory-bean属性
    ...
}

// 解析Meta元素
<!-- spring-meta.xml -->
<bean id="myTestBean" class="bean.MyTestBean">
    <meta key="testStr" value="aaa"/>
</bean>
parseMetaElements(Element ele, BeanMetadataAttributeAccessor attributeAccessor) {
    // 获取当前节点的所有子元素
    ...
}

4、bean的加载

MyTestBean bean = (MyTestBean) bf.getBean("myTestBean");
步骤:
(1) 转换对应的beanName
 name="&aa"=>name="aa" || A->B->C=>C
(2) 尝试从缓存中加载单例
 singletonFactories集合缓存ObjectFactory
(3) bean的实例化
 getObjectForBeanInstance(sharedInstance, name, beanName, mbd)
(4) 原型模式的依赖检查
 A有B属性,B有A属性,属性循环依赖
 isPrototypeCurrentlyInCreation(beanName)
(5) 检测parentBeanFactory
(6) 将存储XML配置文件的GernericBeanDefinition转换为RootBeanDefinition
(7) 寻找依赖
(8) 针对不同的scope进行bean的创建
 scope="singleton||prototype||other"
(9) 类型转换
 return (T) bean;
代码实现如下:

(1) 转换对应的beanName
String beanName = transformedBeanName(name);
(2) 尝试从缓存中加载单例
T doGetBean(args ...){
    Object bean; 
    sharedInstance = getSingleton(beanName);
    (3) bean的实例化
    if (!sharedInstance) { // 非单例
        bean = getObjectForBeanInstance(beanName, mbd, args);
    } else { // 单例
        (4) 原型模式的依赖检查
        if (isPrototypeCurrentlyInCreation(beanName)) throw e;
        
        (5) 检测parentBeanFactory
        BeanFactory parentBeanFactory = getParentBeanFactory();
        if (parentBeanFactory != null) {
            nameToLoopup = orginalBeanName(name);
            // 递归到BeanFactory中寻找
            return parentBeanFactory.getBean(nameToLoopup, args);
        }
        
        (6) 将存储XML配置文件的GernericBeanDefinition转换为RootBeanDefinition
        final RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
        checkMergedBeanDefinition(mbd, beanName, args);
        
        (7) 寻找依赖
        // 存在依赖,递归实例化bean
        String[] dependsOn = mbd.getDependsOn();
        if (dependsOn != null) {
            for (String dependsOnBean : dependsOn){
                getBean(dependsOnBean);
                registerDependentBean(dependsOnBean);
            }
        }
        
        (8) 针对不同的scope进行bean的创建
        // 实例化mbd本身
        if (mbd.isSingleton()){
            sharedInstance = getSingleton(beanName, new ObjectFactory<Object>(){
                    getObject() {
                        try {
                            return createBean(beanName, mbd, args);
                        } catch(e) {
                            destoryName(beanName);
                            throw e;
                        }
                    }
                });
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
        } else if (mbd.isPrototype()) {
            prototypeInstance;
            try {
                beforePrototypeCreation(beanName);
                prototypeInstance = createBean(beanName, mbd, args);
            } finally {
                afterPrototypeCreation(beanName);
            }
            bean = getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
        } else {
            // 指定的scope上实例化bean
            String scopeName = mbd.getScope();
            final Scope scope = this.scopes.get(scopeName);
            scopeInstance = scope.get(beanName, new ObjectFactory<Object>() {
                getObject() {
                    try {
                        return createBean(beanName, mbd, args);
                    } finally {
                        afterPrototypeCreation(beanName);
                    }
                }
            });
            bean = getObjectForBeanInstance(scopeInstance, name, beanName, mbd);
        }
    }
    (9) 类型转换
    if (requriedType != null) {
        return getTypeConverter().convertIfNecessary(bean, requiredType);
    }
    return (T) bean;
}

5.1 FactoryBean接口类

FactoryBean
    |-- T getObject(); // 
    |-- Class<?> getObjectType();
    |-- boolean isSingleton();
CarFactoryBean implements FactoryBean<Car> {
    Car getObject() {
        Car car = new Car();
        String[] infos = carInfo.split(",");
        car.setBrand(infos[0]);
        car.setMaxSpeed(Integer.valueOf(infos[1]));
        car.setPrice(Double.valueOf(infos[2]));
        return car;
    }
    
    String carInfo;
    // setter、getter方法
    isSingleton() {
        return false;
    }
}
<!-- srping-bean.xml -->
<bean id="car" class="com.test.CarFactoryBean" carInfo="跑车,400,2000"/>
代码实现:
    getBean("car") -> spring发现CarFactoryBean implements FactoryBean接口,容器调用接口方法CarFactoryBean#getObject()返回
    getBean("&car") -> CarFactoryBean

5.2 缓存中获取单例

Object getSingleton(String beanName) {
    return getSingleton(beanName, true);
}
Object getSingleton(beanName, allowEarlyReference) {
    // 检查缓存是否存在
    Object singletonObject = this.singletonObjects.get(beanName);
    if (null == getSingleton) {
        synchronized(this.singletonObjects) {
            singletonObject = this.earlySingletonObjects.get(beanName);
            if (singletonObject == null && allowEarlyReference) {
                // 当某些方法需要提前初始化的时候会调用addSingletonFactory方法将对应的ObjectFactory初始化策略存储在singletongFactories
                ObjectFactory singletonFactory = this.singletonFactories.get(beanName);
                if (singletonFactory != null) {
                    // 调用预先设定的getObject方法
                    singletonObject = singletonFactory.getObject();
                    // 记录在缓存中,earlySingletonObjects与singletonFactories互斥
                    this.earlySingletonObjects.put(beanName, singletonObject);
                    this.singletonFactories.remove(beanName);
                }
            }
        }
    }
    return singletonObject != NULL_OBJECT ? singletonObject : null;
}

5.3 从bean的实例中获取对象

(1) 对FactoryBean做正确性的验证
(2) 对非FactoryBean不做任务处理
(3) 对bean进行转换
(4) 将从Factory中解析bean的工作委托给getObjectFromFactoryBean

getObjectForBeanInstance(beanInstance, name, beanName, mbd) {
    // &testBeanFactory
    if (BeanFactoryUtils.isFactoryDereference(name) && !(beanInstance instanceof FactoryBean)) {
        throw e;
    }
    // &testBeanFactory
    if (!(beanInstance instanceof FactoryBean) || BeanFactoryUtils.isFactoryDereference(name)) {
        return beanInstance;
    }
    // 加载factoryBean
    Object object = null;
    if (mbd == null) {
        // 尝试从缓存中加载bean
        object = getCachedObjectForFactoryBean(beanName);
    }
    if (object == null) {
        FactoryBean<?> factory = (FactoryBean<?>) beanInstance;
        if (mbd == null && containsBeanDefinition(beanName)) {
            mbd = getMergedLocalBeanDefinition(beanName);
        }
        // 是否是用户定义的而不是应用程序本身定义的
        boolean synthetic = (mbd != null && mbd.isSynthetic());
        object = getObjectFromFactoryBean(factory, beanName, !synthetic);
    }
}
getObjectFromFactoryBean(factory, beanName, shouldPostProcess) {
    // 如果是单例
    if (factory.isSingleton() && containsSingleton(beanName)) {
        synchronized(getSingletonMutex()) {
            Object object = this.factoryBeanObjectCache.get(beanName);
            if (object == null) {
                object = doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess);
                this.factoryBeanObjectCache.put(beanName, object);
            }
            return object;
        }
    } else {
        return doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess);
    }
}
doGetObjectFromFactoryBean(factory, beanName, shouldPostProcess) {
    Object object = null;
    try {
        if (System.getSecurityManager() != null) { // 权限验证
            try {
                Object = AccessController.doPrivileged(new PrivilegedExceptionAction<Object>(){
                    run() {
                        return factory.getObject();
                    }
                });
            } catch (e) {
                throw e;
            }
        } else {
            object = factory.getObject();
        }
    } catch (e) {
        throw e;
    }
    if (object != null && shouldPostProcess) {
        try {
            object = postProcessObjectFromFactoryBean(object, beanName);
        } catch (e) {
            throw e;
        }
    }
    return object;
}
postProcessObjectFromFactoryBean(object, beanName) {
    return applyBeanPostProcessorsAfterInitialization(object, beanName);
}
applyBeanPostProcessorsAfterInitialization(existingBean, beanName) {
    Object result = existingBean;
    for (BeanPostProcessor beanPostProcessor : getBeanPostProcessors()) {
        result = beanPostProcessor.postProcessorsAfterInitialization(result, beanName);
        return result;
    }
    return result;
}

5.4 获取单例

(1) 检查缓存是否已经加载过
(2) 若没有加载,则记录beanName的正在加载状态
(3) 加载单例前记录加载状态
(4) 通过调用参数传入的ObjectFactory的个体Object实例化bean
(5) 加载单例后的处理方法调用
(6) 将结果记录到缴存并删除加载bean过程中所记录的各种辅助状态
(7) 返回处理结果
getSingleton(beanName, new ObjectFactory) {
    synchronized (this.singletonObjects) {
        Object singletonObject = this.singletonObjects.get(beanName);
        if (singletonObject == null) {
            beforeSingletonCreation(beanName);
            try {
                singletonObject = singletonFactory.getObject();
            } catch (e) {
                throw e;
            } finally {
                afterSingletonCreation(beanName);
            }
            // 加入缓存
            addSingleton(beanName, singletonObject);
        }
    }
    return (singletonObject != NULL_OBJECT ? singletonObject : null)
}
beforeSingletonCreation(beanName) {
    if (!this.singletonsCurrentlyCreation.add(beanName)) { // 将当前正要创建的bean记录在缓存中,这样便可以对循环依赖进行检测
        throw e;
    }
}
afterSingletonCreation(beanName) {
    if (!this.singletonsCurrentlyCreation.remove(beanName)) { // 加载结束后,移除缓存中对该bean正在加载状态的记录
        throw e;
    }
}
addSingleton(beanName, singletonObject) {
    synchronized (this.singletonObjects) {
        // 将结果记录到缓存,并删除加载bean过程中所记录的辅助状态
        this.singletonObjects.put(beanName, singletonObject);
        this.singletonFatories.remove(beanName);
        this.earlySingletonObjects.remove(beanName);
        this.registeredSingletons.add(beanName);
    }
}
getSingleton(beanName, new ObjectFactory<Object>(){
    public Object getObject() {
        try {
            return createBean(beanName, mbd, args);
        } catch (e) {
            throw e;
        }
    }
});

5.5 准备创建bean

(1) 根据设置的class属性,或者根据className来解析class
(2) 对override属性进行标记及验证
(3) 应用初始化前的后处理器,解析指定bean是否存在初始化前的短路操作
(4) 创建bean
createBean(beanName, mbd, args) {
    // 根据设置的class属性,或者根据className来解析class
    resolveBeanClass(mbd, beanName);
    
    // 对override属性进行标记及验证
    try {
        mbd.prepareMethodOverrides();
    } catch (e) {
        throw e;
    }
    // 给BeanPostProcessors一个机会返回代理来替代真正的实例
    Object bean = resolveBeforeInstantiation(beanName, mbd);
    if (bean != null) {
        return bean;
    }
    // 创建bean
    Object beanInstance = doCreateBean(beanName, mbd, args);
    return beanInstance;
}

prepareMethodOverrides() {
    MethodOverrides methodOverrides = getMethodOverrides();
    for (MethodOverride mo : MethodOverrides) {
        prepareMethodOverride(mo);
    }
}
// lookup-method、replace-method属性
prepareMethodOverride(mo) {
    // 获取对应类中对应方法名的个数
    int count = ClassUtils.getMethodCountForName(getBeanClass(), mo.getMethodName());
    if (count == 0) {
        throw e;
    } else if (count == 1) {
        // 标记未被覆盖,避免参数类型检查的开销
        mo.setOverloaded(false);
    }
}
|-- 实例化前置处理
resolveBeforeInstantiation(beanName, mbd) {
    Object bean = null;
    try {
        bean = applyBeanPostProcessorsBeforeInitialization(mbd.getBeanClass(), beanName);
        if (bean != null) {
            bean = applyBeanPostProcessorsAfterInitialization(mbd.getBeanClass(), beanName);
        }
        mbd.beforeInstantiationResolved = (bean != null);
    } catch (e) {
        throw e;
    }
    return bean;
}
|-- 实例化前的处理器应用
applyBeanPostProcessorsBeforeInitialization(beanClass, beanName) {
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
        if (bp instanceof InstantiationAwareBeanPostProcessor) {
            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor)bp;
            Object result = ibp.postProcessorsBeforeInitialization(beanClass, beanName);
            if (result != null) {
                return result;
            }
        }
    }
    return null;
}
|-- 实例化后的处理器应用
applyBeanPostProcessorsAfterInitialization(existingBean, beanName) {
    
    Object result = existingBean;
    for (BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
        Object result = beanProcessor.postProcessorsAfterInitialization(result, beanName);
        if (result != null) {
            return result;
        }
    }
    return result;
}

5.6 循环依赖

(1) 循环依赖定义:
    循环依赖就是循环引用,就是存在2个或多个bean相互之间的持有对方,如:A->B->C->A,A->B->A
(2) 循环依赖的类型:
    构造器循环依赖、setter循环依赖
5.6.1 构造器循环依赖处理
    TestA、TestB、TestC
    TestA -> 查找“当前创建bean池”,如果没发现则继续准备构造器参数“testB”,并将“testA”标识符放到“当前创建bean池”
    TestB -> 查找“当前创建bean池”,如果没发现则继续准备构造器参数“testC”,并将“testB”标识符放到“当前创建bean池”
    TestC -> 查找“当前创建bean池”,如果没发现则继续准备构造器参数“testA”,并将“testC”标识符放到“当前创建bean池”
    准备构造器参数“testA”时,发现该 bean的标识符在“当前创建bean池”存在,抛出BeanCurrentlyInCreationException。
    
5.6.2 setter循环依赖处理
    TestA、TestB、TestC
    TestA -> 暴露ObjectFactory工厂,并将“testA”标识符放到“当前创建bean池”,然后进行setter注入“testB”
    TestB -> 暴露ObjectFactory工厂,并将“testB”标识符放到“当前创建bean池”,然后进行setter注入“testC”
    TestC -> 暴露ObjectFactory工厂,并将“testC”标识符放到“当前创建bean池”,然后进行setter注入“testA”,进入注入“TestA”时由于提前暴露了“ObjectFactory”工厂,从而使用它返回提前暴露一个创建中的bean。
    最后依赖注入"TestB""TestA",完成setter注入。
    
5.6.3 prototype范围的依赖处理
    scope="prototpye" -> 由于prototpye作用域无法完成依赖注入,spring容器不进行缓存prototype作用域的bean,因此无法提前暴露一个创建中的bean。
    scope="singleton" -> setAllowCircularReferences(false); // 禁用循环引用

5.7 创建bean

(1) 如果是单例则需要首先清除缓存
(2) 实例化bean,将BeanDefinition转换为BeanWrapper
(3) MergedBeanDefinitionPostProccessor的应用
(4) 依赖处理
(5) 属性填充
(6) 循环依赖检查
(7) 注册DisposableBean
(8) 完成创建并返回
protected Object doCreateBean(final String beanName, final RooBeanDefinition mbd, final Object[] args) {
    BeanWrapper instanceWrapper = null;
    // 如果是单例则需要首先清除缓存
    if (mbd.isSingleton()) {
        instanceWrapper = this.factoryBeanObjectCache.remove(beanName);
    }
    // 实例化bean,将BeanDefinition转换为BeanWrapper
    if (instanceWrapper == null) {
        instanceWrapper = createBeanInstance(beanName, mbd, args);
    }
    final Object bean = (instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null);
    Class beanType = (instanceWrapper != null ? instanceWrapper.getWrappedClass() : null);
    // MergedBeanDefinitionPostProccessor的应用
    synchronized (mbd.postProcessingLock) {
        if (!mbd.postProcessed) {
            applyMergedBeanDefinitionPostProccessor(mbd, beanType, beanName);
        }
    }
    // 依赖处理
    // 是否需要提前暴露(单例&循环引用&当前bean正在创建中)
    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences && isSingletongCurrentlyInCreation(beanName));
    if (earlySingletonExposure) {
        // 为避免循环依赖,在bean初始化完成前将创建实例的ObjectFactory加入工厂
        addSingletonFactory(beanName, new ObjectFactory(){
            public Object getObject() throw e {
                // 对bean的再一次依赖引用
                return getEarlyBeanReferences(beanName, mbd, bean);
            }
        });
    }
    
    Object exposedObject = bean;
    // 属性填充
    try {
        populateBean(beanName, mbd, instanceWrapper);
        if (exposedObject != null) {
            // 调用初始化方法,init-method
            exposedObject = initializeBean(beanName, exposedObject, mbd);
        }
    } catch (e) {
        throw e;
    }
    
    // 循环依赖检查
    if (earlySingletonExposure) {
        Object earlySingletonReference = getSingleton(beanName, false);
        if (earlySingletonReference != null) {
            // exposedObject没有在初始化方法改变,说明没有被增强
            if (exposedObject == null) {
                exposedObject = earlySingletonReference;
            } else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
                String[] dependentBeans = getDependentBeans(beanName);
                Set<String> actualDependentBeans = new LinkedHashSet<String>();
                for (String dependentBean : dependentBean) {
                    // 检测依赖
                    if (!removeSingletonIfCreateForTypeCheckOnly(dependentBean)) {
                        actualDependentBeans.add(dependentBean);
                    }
                }
                if (!actualDependentBeans.isEmpty()) {
                    throw e; 
                }
            }
        }
    }
    
    // 注册DisposableBean
    try {
        registerDisposableBeanIfNecessary(beanName, bean, mbd);
    } catch (e) {
        throw e;
    }
    return exposedObject;
}

5.7.1.1 属性的注入

(1) InstantiationAwareBeanPostProcessor处理器的postProcessAfterInstantiation函数的应用,此函数可以控制程序是否继续进行属性填充
(2) 根据类型,提取依赖bean,并统一存入PropertyValues中。
(3) 应用InstantiationAwareBeanPostProcessor处理器的postProcessPropertyValues方法,对属性获取完毕填充前对属性的再次处理,RequiredAnnotationBeanPostProcessor对属性的验证
(4) 将所有PropertyValues中的属性填充至BeanWrapper中
populateBean(beanName, mbd, bw) {
    PropertyValues pvs = mbd.getPropertyValues();
    if (bw == null) {
        if (!pvs.isEmpty()) {
            throw e;
        } else {
            // 没有属性填充
            return ;
        }
    }
    
    boolean continueWithPropertyPopulation = true;
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
        if (bp instanceof InstantiationAwareBeanPostProcessor) {
            InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
            // 返回值是否继续填充bean
            if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                continueWithPropertyPopulation = false;
                break;
            }
        }
    }
    // 如果后处理器发出停止填充命令则终止后续的执行
    if (!continueWithPropertyPopulation) {
        return;
    }
    
    if (mbd.getResolvedAutowireMode() == RooBeanDefinition.AUTOWIRE_BY_NAME || 
            mbd.getResolvedAutowireMode() == RooBeanDefinition.AUTOWIRE_BY_TYPE) {
        MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
        if (mbd.getResolvedAutowireMode() == RooBeanDefinition.AUTOWIRE_BY_NAME) {
            autowireByName(beanName, mbd, bw, newPvs);
        }
        if (mbd.getResolvedAutowireMode() == RooBeanDefinition.AUTOWIRE_BY_TYPE) {
            autowireByType(beanName, mbd, bw, newPvs);
        }
        pvs = newPvs;
    }
    
    // 后处理器已经初始化
    boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    // 需要检查依赖
    boolean needsDepCheck = (mbd.getDependencyCheck() != RootBeanDefinition.DEPENDENCY_CHECK_NONE);
    if (hasInstAwareBpps || needsDepCheck) {
        PropertyDescriptor[] filteredPds = filterPropertyDescriptionsForDependencyCheck(bw);
        if (hasInstAwareBpps) {
            for (BeanPostProcessor bp : getBeanPostProcessors()) {
                InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
                // 对所有需要依赖检查的属性进行后处理
                pvs = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
                if (pvs == null) {
                    return;
                }
            }
        } 
        if (needsDepCheck) {
            checkDependences(beanName, mbd, filteredPds, pvs);
        }
    }
    // 将属性应用到bean中
    applyPropertyValues(beanName, mbd, bw, pvs);
}
// 根据name注入属性
autowireByName(beanName, mbd, bw, newPvs) {
    String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
    for (String propertyName : propertyNames) {
        if (containsBean(propertyName)) {
            // 递归初始化相关的bean
            Object bean = getBean(propertyName);
            pvs.add(propertyName, bean);
            // 注册依赖
            registerDependentBean(propertyName, beanName);
        } else {
            if (logger.isTraceEnabled()) {
                logger.trace(...);
            }
        }
    }
}
// 根据type注入属性
autowireByType(beanName, mbd, BeanWrapper bw, newPvs) {
    try {
        TypeConverter converter = getCustomTypeConverter();
        if (converter == null) {
            converter = bw;
        }
        
        Set<String> autowiredBeanNames = new LinkedHashSet<String>(4);
        // 寻找bw中需要依赖注入的属性
        String[] propertyNames = unsatisfiedNonSimpleProperties(mbd, bw);
        for (String propertyName : propertyNames) {
            PropertyDescriptor pd = bw.getPropertyDescriptor(propertyName);
            if (!Object.calss.equals(pd.getProperType())) {
                // 探测指定的set方法
                MethodParamter methodParam = BeanUtils.getWriteMethodParamter(pd);
                boolean eager = PriorityOrdered.class.isAssignableFrom(bw.getWrappedClass());
                PropertyDescriptor desc = new AutowireByTypeDependencyDescriptor(methodParam, eager);
                
                // 解析指定的属性所匹配的值,并把解析到的属性的名称存储在autowiredBeanNames中,当属性存在多个封装bean时:
                // @Autowired private List<A> aList; 将会找到所有匹配A类型的bean将其注入
                Object autowiredArgument = resolveDependency(desc, beanName, autowiredBeanNames, converter);
                if (autowiredArgument != null) {
                    pvs.add(propertyName, autowiredArgument);
                }
                for (String autowiredBeanName : autowiredBeanNames) {
                    // 注册依赖
                    registerBeanDefinition(autowiredBeanName, beanName);
                }
                autowiredBeanNames.clear();
            }
        }
    } catch (e) {
        throw e;
    }
}
resolveDependency(descriptor, beanName, Set<String> autowiredBeanNames, typeConverter) {
    descriptor.initParamterNameDisconvery(getParamterNameDisconverer());
    // ObjectFactory类注入的特殊处理
    if (descriptor.getDependencyType().equals(ObjectFactory.class)) {
        return new DependencyObjectFactory(descriptor, beanName);
    }
    else if (... eq javaxInjectProviderClass) {
        return new DependencyObjectFactory().createDependencyProvider(descriptor, beanName);
    }
    else {
        // 通用逻辑处理
        return doResolvedDependency(descriptor, descriptor.getDependencyType(), beanName, autowiredBeanNames, typeConverter);
    }
}
doResolvedDependency(descriptor, descriptor.getDependencyType(), beanName, autowiredBeanNames, typeConverter) {
    // 用于支持spring中新增的注解@value
    Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor);
    if (value != null) {
        if (value instanceof String) {
            value = evaluateBeanDefinitionString(strVal, bd);
        }
        TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
        return converter.convertIfNecessary(value, type);
    }
    
    // 属性是数组类型
    if (type.isArray()) { 
        // 数组类型
        Class<?> componentType = type.getComponentType();
        Map<String,Object> matchingBeans = findAutowireCandidates(beanName, componentType, descriptor);
        if (matchingBeans.isEmpty()) {
            if (descriptor.isRequired()) {
                raiseNoSuchBeanDefinitionException(componentType, componentType.getName(), descriptor);
            }
            return null;
        }
        if (autowiredBeanNames != null) {
            autowiredBeanNames.addAll(matchingBeans.keySet());
        }
        TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
        return converter.convertIfNecessary(matchingBeans.values(), type);
    }
    else if (Collection.class.isAssignableFrom(type) && type.isInterface()) {
        // 集合类型
        Class<?> elementType = descriptor.getCollectionType();
        if (elementType == null) {
            if (descriptor.isRequired()) {
                throw e;
            }
            return null;
        }
        Map<String,Object> matchingBeans = findAutowireCandidates(beanName, componentType, descriptor);
        if (matchingBeans.isEmpty()) {
            throw e;
        }
        if (autowiredBeanNames != null) {
            autowiredBeanNames.addAll(matchingBeans.keySet());
        }
        TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
        return converter.convertIfNecessary(matchingBeans.values(), type);
    } 
    else if (Map.class.isAssignableFrom(type) && type.isInterface()) {
        // Map类型
        Class<?> keyType = descriptor.getMapKeyType();
        if (keyType == null) {
            if (descriptor.isRequired()) {
                throw e;
            }
            return null;
        }
        Map<String,Object> matchingBeans = findAutowireCandidates(beanName, componentType, descriptor);
        if (matchingBeans.isEmpty()) {
            throw e;
        }
        if (autowiredBeanNames != null) {
            autowiredBeanNames.addAll(matchingBeans.keySet());
        }
        TypeConverter converter = (typeConverter != null ? typeConverter : getTypeConverter());
        return converter.convertIfNecessary(matchingBeans.values(), type);
    }
    else {
        Map<String,Object> matchingBeans = findAutowireCandidates(beanName, componentType, descriptor);
        if (matchingBeans.isEmpty()) {
            throw e;
        }
        if (matchingBeans.size() > 1) {
            String primaryBeanName = determinePrimaryCandidate(matchingBeans, descriptor);
            if (primaryBeanName == null) {
                throw e;
            }
            if (autowiredBeanNames != null) {
                autowiredBeanNames.add(primaryBeanName);
            }
            return matchingBeans.get(primaryBeanName);
        }
        // 已经可以确定只有一个匹配项
        Map.Entry<String,Object> entry = matchingBeans.entrySet().iterator().next();
        if (autowiredBeanNames != null) {
            autowiredBeanNames.add(entry.getKey());
        }
        return entry.getValue();
    }
}
// 将属性应用到bean中
applyPropertyValues(beanName, mbd, bw, pvs) {
    if (pvs == null || pvs.isEmpty()) {
        return;
    }
    
    MutablePropertyValues mpvs = null;
    List<PropertyValue> original;
    if (bw instancof BeanWrapperImpl) {
        ((BeanWrapperImpl) bw).setSecurityContext(getAccessControlContext());
    }
    if (pvs instanceof MutablePropertyValues) {
        mpvs = (MutablePropertyValues) pvs;
        // 如果mpvs中的值已经被转换为对应的类型那么可以直接设置到beanWrapper中
        try {
            if (mpvs.isConverted()) {
                bw.setPropertyValues(mpvs);
                return;
            }
        } catch (e) {
            throw e;
        }
        original = mpvs.getPropertyValueList();
    } else {
        // 非MutablePropertyValues封装的类型,那么直接使用原始的属性获取方法
        original = Arrays.asList(pvs.getPropertyValues());
    }
    
    TypeConverter converter = getCustomTypeConverter();
    if (converter == null) {
        converter = bw;
    }
    // 获取对应的解析器
    BeanDefinitionValueResolver valueResolver = new BeanDefinitionValueResolver(this, beanName, mbd, converter);
    // Create a deep copy, resolving any references for values.
    List<PropertyValue> deepCopy = new ArrayList<String>(original.size());
    boolean resolveNecessary = false;
    for (PropertyValue pv : original) {
        if (pv.isConverted()) {
            deepCopy.add(pv);
        } else {
            String propertyName = pd.getName();
            Object originalValue = pd.getValue();
            Object resolvedValue = valueResolver.resolveValueIfNecessay(pv, originalValue);
            
            Object convertedValue = resolvedValue;
            boolean convertible = (bw.isWritableProperty(propertyName) && !PropertyUtils.isNestedIndexedProperty(propertyName));
            if (convertible) {
                convertedValue = convertForProperty(resolvedValue, propertyName, bw, converter);
            }
            if (convertedValue == originalValue) {
                if (convertible) {
                    pv.setConvertedValue(convertedValue);
                }
                deepCopy.add(pv);
            }
            else if (convertible && originalValue instanceof TypedStringValue && 
                !((TypedStringValue) originalValue).isDynamic() &&
                !(convertedValue instanceof Collection || ObjectUtils.isArray(convertedValue))){
                pv.setConvertedValue(convertedValue);
                deepCopy.add(pv);
            }
            else {
                resolveNecessary = true;
                deepCopy.add(new PropertyValue(pv, convertedValue));
            }
        }
    }
    if (mpvs != null && !resolveNecessary) {
        mpvs.setConverted();
    }
    try {
        bw.setPropertyValues(new MutablePropertyValues(deepCopy));
    } catch (e) {
        throw e;
    }
}

5.7.2 初始化bean

// spring容器已经执行过bean的实例化,并且进行了属性填充,而就是这时将会调用用户设定的初始化方法
initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
    if (System.getSecurityMananger() != null) {
        AccessController.doPrivileged(new PrivilegedAction<Object>(){
            Object run() {
                invokeAwareMethods(beanName, bean);
                return null;
            }
        });
    } else {
        // 对特殊的bean处理:Aware、BeanClassLoaderAware、BeanFactoryAware
        invokeAwareMethods(beanName, bean);
    }
    
    Object wrappedBean = bean;
    if (mbd != null || !mbd.isSynthetic()) {
        // 应用前处理器
        wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    }
    try {
        // 激活用户自定义的init方法
        invokeInitMethod(beanName, wrappedBean, mbd);
    } catch (e) {
        throw e;
    }
    if (mbd != null || !mbd.isSynthetic()) {
        // 后处理器应用
        wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }
    return wrappedBean;
}
invokeAwareMethods(final String beanName, final Object bean) {
    if (bean instanceof Aware) {
        if (bean instanceof BeanNameAware) {
            ((BeanNameAware) bean).setBeanName(beanName);
        }
        if (bean instanceof BeanClassLoaderAware) {
            ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
        }
        if (bean instanceof BeanFactoryAware) {
            ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
        }
    }
}
// 处理器应用
applyBeanPostProcessorsBeforeInitialization(existingBean, beanName) {
    Object result = existingBean;
    for ( BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
        result = beanProcessor.postProcessBeforeInitialization(result, beanName);
        if (result == null) {
            return result;
        }
    }
    return result;
}
applyBeanPostProcessorsAfterInitialization(existingBean, beanName) {
    Object result = existingBean;
    for ( BeanPostProcessor beanProcessor : getBeanPostProcessors()) {
        result = beanProcessor.postProcessAfterInitialization(result, beanName);
        if (result == null) {
            return result;
        }
    }
    return result;
}
// 激活用户自定义的init方法
invokeInitMethod(beanName, bean, mbd) {
    // 检查是否是InitializingBean,如果是则调用afterPropertiesSet方法
    boolean isInitializingBean = (bean istanceof InitializingBean);
    if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
    
        if (System.getSecurityManager() != null) {
            try {
                AccessController.doPrivileged(new PrivilegedExceptionAction<Object>(){
                    Object run() {
                        ((InitializingBean) bean).afterPropertiesSet();
                        return null;
                    }
                });
            } catch (e) {
                throw e;
            }
        } else {
            ((InitializingBean) bean).afterPropertiesSet();
        }
    }
    if (mbd != null) {
        String initMethodName = mbd.getInitMethodName();
        if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName))
            && !mbd.isExternallyManagedInitMethod(initMethodName)) {
            // 调用自定义初始化方法
            invokeCustomInitMethod(beanName, bean, mbd);
        }
    }
}

5.7.3 注册DisposableBean

protected void registerDisposableBeanIfNecessary(String beanName, Object bean, RootBeanDefinition mbd) {
    AccessControlContext acc = (System.getSecurityManager() != null ? getAccessControlContext() : null);
    if (!mbd.isPrototype() && requiredDestruction(bean, mbd)) {
        if (mbd.isSingleton()) {
            // 单例模式下需要注册需要销毁的bean,此方法中会处理实现DisposableBean的bean,
            // 并且对所有的bean使用DestrunctionAwareBeanPostProccessors处理
            // DisposableBean DestrunctionAwareBeanPostProccessors
            registerDisposableBean(beanName, new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
        } else {
            scope scope = this.scopes.get(mgd.getScope());
            if (scope == null) {
                throw e;
            }
            scope.registerDestructionCallback(beanName, new DisposableBeanAdapter(bean, beanName, mbd, getBeanPostProcessors(), acc));
        }
    }
}

6. 容器的功能扩展

ApplicationContext,用于扩展BeanFactory现有功能。
  使用场景:
   ApplicationContext ctx = new ClassPathXmlApplicationContext("beanFactoryTest.xml");

|-- ClassPathXmlApplicationContext(String configLoocation) {
                this(new String[]{configLocation}, true, null);
            }
        |-- ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) {
                super(parent);
                setConfigLocations(configLocations);
                if (refresh) {
                    refresh();
                }
            }
        |-- 6.1 设置路径
            |-- setConfigLocations(String[] locations) {
                    if (locations != null) {
                        this.locations = new String[locations.length];
                        for (i=0 ; i<locations.length; i++) {
                            // 解析给定路径,如${var}特殊符号,搜寻匹配的变量并替换
                            this.locations[i] = resolvePath(locations[i]).trim();
                        }
                    } else {
                        this.configLocations = null;
                    }
                }
        |-- 6.2 扩展功能
            (1) 初始化前准备工作,例如对系统属性或者环境变量进行准备及验证
            (2) 初始化BeanFactory,并进行XML文件读取
            (3) 对BeanFactory进行各种属性填充(@Qualifier、@Autowire)
            (4) 子类覆盖方法处理
            (5) 激活各种BeanFactory处理器
            (6) 注册拦截Bean创建的bean处理器,这里只是注册,真正调用是在getBean时候
            (7) 为上下文初始化Message源,即不同的语言的消息体,国际化处理
            (8) 初始化应用消息广播器,并放入“applicationEventMulticaster”bean中
            (9) 留给子类来初始化其它的bean
            (10) 在所有注册的bean中查找Listener bean,注册到消息广播器中
            (11) 初始化剩下的单实例(非惰性的)
            (12) 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
            |-- refresh() {
                    // 准备刷新的上下文环境
                    prepareRefresh();
                    // 初始化FactoryBean,并进行XML文件读取
                    ConfigurableListableBeanFacbeanFactory beanFactory = obtainFreshBeanFactory();
                    // 对BeanFactory进行各种属性填充
                    prepareBeanFactory(beanFactory);
                    
                    try {
                        // 子类覆盖方法处理
                        postProcessBeanFactory();
                        // 激活各种BeanFactory处理器
                        invokeBeanFactoryPostProcessors(beanFactory);
                        // 注册拦截Bean创建的bean处理器,这里只是注册,真正调用是在getBean时候
                        registerBeanPostProcessors(beanFactory);
                        // 为上下文初始化Message源,即不同的语言的消息体,国际化处理
                        initMessageSource();
                        // 初始化应用消息广播器,并放入“applicationEventMulticaster”bean中
                        initApplicationEventMulticaster();
                        // 留给子类来初始化其它的bean
                        onRefresh();
                        // 在所有注册的bean中查找Listener bean,注册到消息广播器中
                        registerListeners();
                        // 初始化剩下的单实例(非惰性的)
                        finishBeanFactoryInitialization(beanFactory);
                        // 完成刷新过程,通知生命周期处理器lifecycleProcessor刷新过程,同时发出ContextRefreshEvent通知别人
                        finishRefresh();
                    } catch (e) {
                        // 销毁bean
                        destoryBeans();
                        // 取消通知
                        cancalRefresh(e);
                        throw e;
                    }
                }
        |-- 6.3 环境准备
            |-- prepareRefresh() {
                    this.startupDate = System.currentTimeMillis();
                    synchronized (this.activeMonitor) {
                        this.active = true;
                    }
                    initPropertySources();
                    getEnvironment().validateRequiredProperties();
                }
                |-- 例如需要配置环境变量VAR,可以继承
                    |-- MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext {
                            MyClassPathXmlApplicationContext(String... configLocations) {
                                super(configLocations);
                            }
                            @Override 
                            void initPropertySources() {
                                getEnvironment().setRequiredProperties("VAR");
                            }
                        }
        |-- 6.4 加载factoryBean
            (1) 创建DefaultListableBeanFactory
            (2) 指定序列化id
            (3) 定制BeanFactory
            (4) 加载BeanDefinition
            (5) 使用全局变量记录BeanFactory类实例
            |-- obtainFreshBeanFactory() {
                    refreshBeanFactory();
                    ConfigurableListableBeanFacbeanFactory beanFactory = getBeanFactory();
                    return beanFactory;
                }
            |-- refreshBeanFactory() {
                    if (hasBeanFactory()) {
                        // 销毁bean
                        destoryBeans();
                        closeBeanFactory(e);
                    }
                    try {
                        beanFactory = createBeanFactory();
                        beanFactory.setSerializationId(getId());
                        customizeBeanFactory(beanFactory);
                        loadBeanDefinitions(beanFactory);
                        synchronized (this.beanFactoryMonitor) {
                            this.beanFactory = beanFactory;
                        }
                    } catch (e) {
                        throw e;
                    }
                }
            |-- 6.4.1 定制BeanFactory
                |-- customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
                        if (this.allowBeanDefinitionOverring != null) {
                            beanFactory.setAllowBeanDefinitionOverring(this.allowBeanDefinitionOverring);
                        } 
                        if (this.allowCircularReferences != null) {
                            beanFactory.setAllowCircularReferences(allowCircularReferences);
                        } 
                        beanFactory.setAutowireCandidateResolver(new QualifierAnnotationAutowireCandidateResolver());
                    }
                    |-- 应用:子类覆盖设置属性
                    |-- MyClassPathXmlApplicationContext extends ClassPathXmlApplicationContext {
                            @Override
                            void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
                                super.setAllowBeanDefinitionOverring(false);
                                super.setAllowCircularReferences(false);
                                super.customizeBeanFactory(beanFactory);
                            }
                        }
                |-- 设置AutowireCandidateResolver
                    |-- Object value = getAutowireCandidateResolver().getSuggestedValue(descriptor) {
                            Object value = findValue();
                            if (value = null) {
                                methodParam = descriptor.getMethodParamter();
                                if (methodParam != null) {
                                    value = findValue(methodParam.getMethodAnnotations());
                                }
                            }
                            return value;
                        }
            |-- 6.4.2 加载BeanDefinition
                |-- loadBeanDefinitions(beanFactory) {
                        // 为指定的BeanFactory创建XmlBeanDefinition
                        XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader();
                        
                        // 对beanDefinitionReader进行环境变量设置
                        beanDefinitionReader.setEnvironment(this.getEnvironment());
                        beanDefinitionReader.setResourceLoader(this);
                        beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
                        
                        // 对beanDefinitionReader进行设置,可以覆盖
                        initBeanDefinitionReader(beanDefinitionReader);
                        
                        loadBeanDefinitions(beanDefinitionReader);
                    }
                |-- loadBeanDefinitions(BeanDefinitionReader reader) {
                        Resource[] configResources = getConfigResources();
                        if (configResources != null) {
                            reader.loadBeanDefinitions(configResources);
                        }
                        String[] configLocations = getConfigLocations();
                        if (configLocations != null) {
                            reader.loadBeanDefinitions(configLocations);
                        }
                    }
        |-- 6.5 功能扩展
            |-- prepareBeanFactory(ConfigurableListableBeanFactory beanFactory) {
                    beanFactory.setBeanClassLoader(getClassLoader());
                    
                    // 增加对SPEL语言支持
                    beanFactory.setBeanExpressionResolver(new StandarBeanExpressionResolver());
                    
                    // 增加对属性编辑器的支持
                    beanFactory.addPropertyEditorRegistrar(new ResouceEditorRegistrar(this, getEnvironment()));
                    
                    // 增加对一些内置类,比如EnvironmentAware、MessageSourceAware信息的注入
                    beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
                    
                    // 设置了依赖功能可忽略的接口
                    beanFactory.ignoreDependencyInterface(ResourceLoaderAware.class);
                    beanFactory.ignoreDependencyInterface(ApplicationEventPulisherAware.class);
                    beanFactory.ignoreDependencyInterface(MessageSourceAware.class);
                    beanFactory.ignoreDependencyInterface(ApplicationContextAware.class);
                    beanFactory.ignoreDependencyInterface(EnvironmentAware.class);
                    
                    // 注册了一些固定依赖的属性
                    beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
                    beanFactory.registerResolvableDependency(ResourceLoader.class, this);
                    beanFactory.registerResolvableDependency(ApplicationEventPulisher.class, this);
                    beanFactory.registerResolvableDependency(ApplicationContext.class, this);
                    
                    // 增加AspectJ的支持
                    if (beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
                        beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
                        // Set a temporary ClassLoader for type matching.
                        beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
                    }
                    
                    // 将相关环境变量及属性注册以单例模式注册
                    if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
                        beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME,getEnvironment());
                    }
                    if (!beanFactory.containsLocalBean(SYSTEM_PROPERTIES_BEAN_NAME)) {
                        beanFactory.registerSingleton(SYSTEM_PROPERTIES_BEAN_NAME,getEnvironment());
                    }
                    if (!beanFactory.containsLocalBean(SYSTEM_ENVIRONMENT_BEAN_NAME)) {
                        beanFactory.registerSingleton(SYSTEM_ENVIRONMENT_BEAN_NAME,getEnvironment());
                    }
                }
                |-- 6.5.1 增加对SPEL语言支持
                    |-- <!-- spring.xml -->
                        <bean><property name="instrument" value="#{saxphone}"></property></bean>
                    |-- applyPropertyValues
                        --> BeanDefinitionValueResolver valueResolver
                            --> evluateBeanDefinitionString(String value, BeanDefinition beanDefinition) {
                                    if (this.beanExpressionResolver == null) {
                                        return value;
                                    }
                                    scope = (beanDefinition != null ? getRegisteredScope(beanDefinition.getScope()) : null);
                                    return this.beanExpressionResolver.evaluate(value, new BeanExpressionContext(this, scope));
                                }
                |-- 6.5.2 增加对属性编辑器的支持    
                    |-- <!-- spring.xml -->
                        <bean id="userManager" class="com.test.UserManager">
                            <property name="datavalue">
                                <value>2013-03-15</value>
                            </property>
                        </bean>
                    |-- 直接使用会报错,如下:
                        UserManager userManager = ctx.getBean(userManager);
                        sysout(userManager);
                    |-- 方案1:使用自定义属性编辑器
                        |-- DatePropertyEditor extends PropertyEditorSupport {
                                private String format = "yyyy-MM-dd";
                                void setFormate(String format) {
                                    this.format = format;
                                }
                                @Override
                                public void setAsText(String args0) throw e {
                                    SimpleDateFormat sdf = new SimpleDateFormat(format);
                                    try {
                                        Date d = sdf.parse(args0);
                                        this.setValue(d);
                                    } catch (e) {
                                        throw e;
                                    }
                                }
                            }
                        |-- 将自定义编辑器注册到Spring中
                            |-- <!-- spring.xml -->
                                <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
                                    <property name="customEditors">
                                        <map>
                                            <entry key="java.util.Date">
                                                <bean class="com.test.DatePropertyEditor">
                                                    <property name="format" value="yyyy-MM-dd"/>
                                                </bean>
                                            </entry>
                                        </map>
                                    </property>
                                </bean>
                    |-- 方案2:使用Spring自带的属性编辑器CustomDateEditor
                        |-- (1) 定义属性编辑器
                            |-- DatePropertyEditorRegistrar implements PropertyEditorRegistrar {
                                    registerCustomEditors(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),true));
                                }
                        |-- (2) 注册到Spring中
                            |-- <!-- spring.xml -->
                                <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
                                    <property name="propertyEditorRegistrars">
                                        <list>
                                            <bean class="com.test.DatePropertyEditorRegistrar"></bean>
                                        </list>
                                    </property>
                                </bean>
                        |-- registerCustomEditors(PropertyEditorRegistrar registry) {
                                ResourceEditor baseEditor = new ResourceEditor(this.resourceLoader, this.propertyResolver);
                                doRegisterEditor(registry, Resource.class, baseEditor);
                                doRegisterEditor(registry, ContextResource.class, baseEditor);
                                doRegisterEditor(registry, InputStream.class, new InputStremEditor(baseEditor));
                                doRegisterEditor(registry, InputSource.class, new InputSourceEditor(baseEditor));
                                doRegisterEditor(registry, File.class, new FileEditor(baseEditor));
                                doRegisterEditor(registry, URL.class, new URLEditor(baseEditor));
                                
                                ClassLoader classLoader = this.resourceLoader.getClassLoader();
                                doRegisterEditor(registry, URI.class, new URIEditor(classLoader));
                                doRegisterEditor(registry, Class.class, new ClassEditor(classLoader));
                                doRegisterEditor(registry, Class[].class, new ClassArrayEditor(classLoader));
                                if (this.resourceLoader instanceof ResourcePatternResolver) {
                                    doRegisterEditor(registry, Resource[].class, 
                                        new ResourceArrayPropertyEditor((ResourcePatternResolver) this.resourceLoader, this.propertyResolver));
                                }
                            }
                            doRegisterEditor(PropertyEditorRegistrar registry, Class<?> requiredType, PropertyEditor editor) {
                                if (registry instanceof PropertyEditorRegistrySupport) {
                                    ((PropertyEditorRegistrySupport) registry).overrideDefaultEditor(requiredType, editor);
                                } else {
                                    registry.registerCustomEditors(requiredType, editor);
                                }
                            }
                            |-- BeanWrapperImpl implements BeanWrapper extends PropertyEditorRegistrySupport {
                                    createDefaultEditors() {
                                        this.defaultEditors = new HashMap<Class<?>, PropertyEditor>(64);
                                        
                                        this.defaultEditors.put(Charset.class, new CharsetEditor());
                                        this.defaultEditors.put(Class.class, new ClassEditor());
                                        ...
                                    }
                                } 
                |-- 6.5.3 添加ApplicationContextAwareProcessor处理器
                    |-- prepareBeanFactory()
                        --> beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this)) // 注册个BeanPostProcessor,而真正的逻辑在ApplicationContextAwareProcessor中
                            --> ApplicationContextAwareProcessor implements BeanPostProcessor {
                                    // spring激活bean的init-method方法前后,会调用BeanPostProcessor的postProcessorBeforeInitailization()方法和postProcessAfterInitailization()方法
                                    // 同样对ApplicationContextAwareProcessor我们也关心这两个方法
                                    Object postProcessorBeforeInitailization(Object bean, String beanName) {
                                        return bean;
                                    } 
                                    Object postProcessAfterInitailization(final Object bean, String beanName) {
                                        AccessController acc = null;
                                        if (System.getSecurityManager() != null &&
                                                (bean instanceof EnvironmentAware 
                                                    || bean instanceof EmbeddedValueResolverAware
                                                    || bean instanceof ResourceLoaderAware
                                                    || bean instanceof MessageSourceAware
                                                    || bean instanceof ApplicationContextAware)) {
                                            acc = this.applicationContext.getBeanFactory().getAccessControlContext();
                                        }
                                        if (acc != null) {
                                            AccessController.doPrivileged(new PrivilegedAction<Object>(){
                                                public Object run() {
                                                    invokeAwareInterfaces(bean);
                                                    return null;
                                                }
                                            });
                                        } else {
                                            invokeAwareInterfaces(bean);
                                        }
                                        return bean;
                                    }
                                    invokeAwareInterfaces(Object bean) {
                                        if (bean instanceof Aware) {
                                            if (bean instance of EnvironmentAware) {
                                                ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
                                            }
                                            if (bean instance of EmbeddedValueResolverAware) {
                                                ((EmbeddedValueResolverAware) bean).setEmbeddedValueResolver(new EmbeddedValueResolver(this.applicationContext.getBeanFactory()));
                                            }
                                            if (bean instance of EnvironmentAware) {
                                                ((EnvironmentAware) bean).setEnvironment(this.applicationContext.getEnvironment());
                                            }
                                            if (bean instance of ResourceLoaderAware) {
                                                ((ResourceLoaderAware) bean).setResourceLoader(this.applicationContext);
                                            }
                                            if (bean instance of ApplicationContextAware) {
                                                ((ApplicationContextAware) bean).setApplicationContextContext(this.applicationContext);
                                            }
                                            ...
                                        }
                                    }
                                }
                    
                |-- 6.5.4 设置忽略属性 
                    beanFactory.ingoreDependencyInterface(ResourceLoaderAware.class);
                    beanFactory.ingoreDependencyInterface(ApplicationEventPulisherAware.class);
                    beanFactory.ingoreDependencyInterface(MessageSourceAware.class);
                    beanFactory.ingoreDependencyInterface(ApplicationContextAware.class);
                    beanFactory.ingoreDependencyInterface(EnvironmentAware.class);
                |-- 6.5.5 注册依赖
                    beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);
                    beanFactory.registerResolvableDependency(ResourceLoader.class, beanFactory);
                    beanFactory.registerResolvableDependency(ApplicationEventPulisher.class, beanFactory);
                    beanFactory.registerResolvableDependency(ApplicationContext.class, beanFactory);
            
            |-- 6.6 BeanFactory 的后处理 
                |-- 6.6.1 激活注册的BeanFactoryPostProcessor
                    |-- (1) BeanFactoryPostProcessor的典型应用:
                        |-- <!-- spring.xml -->
                            <bean id="message" class="com.test.HelloMessage">
                                <property name="mes">
                                    <value>${bean.message}</value>
                                </property>
                            </bean>
                        |-- bean.properties
                            bean.message=Hi, can you find me?
                        |-- 配置信息:
                            <bean id="mesHandler" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
                                <property name="localtions">
                                    <value>config/bean.properties</value>
                                </property>
                            </bean>
                        |-- PropertyPlaceholderConfigurer 间接继承了BeanFactoryPostProcessor
                    |-- (2) 使用自定义BeanFactoryPostProcessor
                        |-- <!-- spring.xml -->
                        <bean id="bfpp" class="com.spring.ch04.ObscenityRemovingBeanFactoryPostProcessor">
                            <property name="obscenties">
                                <set>
                                    <value>bollocks</value>
                                    <value>winky</value>
                                    <value>bum</value>
                                    <value>Microsoft</value>
                                </set>
                            </property>
                        </bean>
                        <bean id="simpleBean" class="com.spring.ch04.SimplePostProcessor">
                            <property name="connectionString" value="bollocks"></property>
                            <property name="password" value="imaginecup"></property>
                            <property name="username" value="Microsoft"></property>
                        </bean>
                        ...
                        |-- ObscenityRemovingBeanFactoryPostProcessor implements BeanFactoryPostProcessor {
                                private Set<String> obscenties;
                                ObscenityRemovingBeanFactoryPostProcessor() {
                                    obscenties = new HashSet<String>();
                                }
                                
                                void postProcessBeanFactory(beanFactory) {
                                    String[] beanNames = beanFactory.getBeanDefinitionNames();
                                    for (String beanName : beanNames) {
                                        BeanDefinition bd = beanFactory.getBeanDefinition(beanName);
                                        StringValueResolver valueREsolver = new StringValueResolver(){
                                            String resolveStringValue(String strVal) {
                                                if (isObscene(strVal)) return "*****";
                                                return strVal;
                                            }
                                        };
                                        BeanDefinitionVisitor vistor = new BeanDefinitionVisitor(valueResolver);
                                        visitor.visitBeanDefinition(bd);
                                    }
                                }
                                boolean isObscene(Object value) {
                                    String potentialObscenity = value.toString().toUppercase();
                                    return this.obscenties.contains();
                                }
                                void setObscenties(Set<String> obscenties) {
                                    this.obscenties.clear();
                                    for(String obscenity : obscenties) {
                                        this.obscenties.add(obscenity.toUpperCase());
                                    }
                                }
                            }
                            // 执行类:
                            public class PropertyConfigurerDemo {
                                main(String[] args) {
                                    bf = new XmlBeanFactory(new ClassPathResource("/META-INF/BeanFactory.xml"));
                                    
                                    ObscenityRemovingBeanFactoryPostProcessor bfpp = (ObscenityRemovingBeanFactoryPostProcessor) bf.get("bfpp");
                                    bfpp.postProcessBeanFactory(bf);
                                    sysout(bf.getBean("simpleBean"));
                                    // 输出结果:SimplePostProcessor{connectionString=*****,username=*****,password=imaginecup}
                                }
                            }
                        |-- 激活BeanFactoryPostProcessor
                            (1) 对于硬编码注册的后处理器的处理,主要通过AbstractApplicationContext中的添加处理器方法addBeanFactoryPostProcessor
                            (2) 记录后处理器主要使用了三个List完成
                                registryPostProcessors:记录通过硬编码方式注册的BeanDefinitionRegistryPostProcessor类型处理器
                                regularPostProcessors:记录通过硬编码方式注册的BeanFactoryPostProcessors
                                registryPostProcessorBeans:记录通过硬编码方式注册的BeanDefinitionRegistryPostProcessor
                            (3) 对以上所记录的List中的后处理器进行统一调用beanFactoryPostProcessors的postProcessBeanFactory()
                            (4) 对beanFactoryPostProcessors中非BeanDefinitionRegistryPostProcessor类的后处理器进行统一调用beanFactoryPostProcessors的postProcessBeanFactory()
                            (5) 普通beanFactory处理
                            |-- invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory) {
                                    // BeanDefinitionRegistry
                                    if (beanFactory instanceof BeanDefinitionRegistry) {
                                        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
                                        
                                        // 
                                        for (BeanFactoryPostProcessor postProcessor :getBeanFactoryPostProcessors()) {
                                            if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                                                registryPostProcessor = (BeanDefinitionRegistryPostProcessor) postProcessor;
                                                // 对于BeanDefinitionRegistryPostProcessor类型,在BeanFactoryPostProcessor基础上还有自己定义的方法,需要先调用
                                                registryPostProcessor.postProcessBeanDefinitionRegistry(registry);
                                                registryPostProcessors.add(registryPostProcessor);
                                            } else {
                                                regularPostProcessors.add(postProcessor);
                                            }
                                        }
                                        
                                        // 配置注册的后处理器
                                        Map<String,BeanDefinitionRegistryPostProcessor> beanMap = beannFactory.getBeanOfType(BeanDefinitionRegistryPostProcessor.class, true, false);
                                        List<BeanDefinitionRegistryPostProcessor> registryPostProcessorBeans = new ArrayList<>(beanMap.values());
                                        for (BeanDefinitionRegistryPostProcessor postProcessor : registryPostProcessorBeans) {
                                            postProcessor.postProcessBeanDefinitionRegistry(registry);
                                        }
                                        // 
                                        invokeBeanFactoryPostProcessors(registryPostProcessors, beanFactory);
                                        invokeBeanFactoryPostProcessors(registryPostProcessorBeans, beanFactory);
                                        invokeBeanFactoryPostProcessors(regularPostProcessors, beanFactory);
                                    } else {
                                        invokeBeanFactoryPostProcessors(getBeanFactoryPostProcessors(), beanFactory);
                                    }
                                    
                                    // 从配置文件中读取的BeanFactoryPostProcessor的处理
                                    String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
                                    List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
                                    List<String> orderedPostProcessorNames = new ArrayList<>();
                                    List<String> nonOrderedPostProcessorNames = new ArrayList<>();
                                    // 对后处理器分类处理
                                    for (String ppName : postProcessorNames) {
                                        if (processedBeans..contains(ppName)) {
                                            // 已经处理过的
                                        } else if (isMatch(ppName, PriorityOrdered.class)) {
                                            priorityOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
                                        } else if (isMatch(ppName, Ordered.class)) {
                                            orderedPostProcessorNames.add(ppName);
                                        } else {
                                            nonOrderedPostProcessorNames.add(ppName);
                                        } 
                                    }
                                    
                                    // 按优先级排序
                                    OrderComparator.sort(priorityOrderedPostProcessors);
                                    invokeBeanFactoryPostProcessors(priorityOrderedPostProcessors, beanFactory);
                                    
                                    // next, invoke the 
                                    List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
                                    for (String postProcessorName : orderedPostProcessorNames) {
                                        orderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class));
                                    }
                                    OrderComparator.sort(orderedPostProcessors);
                                    invokeBeanFactoryPostProcessors(orderedPostProcessors, beanFactory);
                                    
                                    // 无序直接调用
                                    List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
                                    for (String postProcessorName : nonOrderedPostProcessorNames) {
                                        nonOrderedPostProcessors.add(getBean(postProcessorName, BeanFactoryPostProcessor.class));
                                    }
                                    invokeBeanFactoryPostProcessors(nonOrderedPostProcessors, beanFactory);
                                }
            |-- 6.6.2 注册BeanPostProcessor
                |-- 自动注册功能
                |-- MyInstantiationAwareBeanPostProcessor implements InstantiationAwareBeanPostProcessor {
                        Object postProcessBeforeInitailization(Object bean, String beanName) {
                            sysout("==============");
                            return null;
                        }
                    }
                |-- <!-- spring.xml -->
                    <bean class="processors.MyInstantiationAwareBeanPostProcessor"/>
                |-- ApplicationContext ctx ; -> ctx.get("xxBean") -> sysout("==============");
                |-- 上面这个特性是在registerBeanPostProcessors方法中完成的
                |-- protected void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory) {
                        // 从配置文件中读取的BeanFactoryPostProcessor的处理
                        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
                        
                        int beanPostTargetProcessorCount = beanFactory.getBeanPostProcessorCount();
                        beanFactory.addBeanPostProcessor(new BeanPostProcessorChecker(beanFactory, beanPostTargetProcessorCount));
                        // 使用PriorityOrdered保证顺序
                        List<BeanFactoryPostProcessor> priorityOrderedPostProcessors = new ArrayList<>();
                        // 
                        List<MergedBeanDefinitionPostProccessor> internalPostProcessor = new ArrayList<>();
                        // 使用Ordered保证顺序
                        List<String> orderedPostProcessorNames = new ArrayList<>();
                        // 无序
                        List<String> nonOrderedPostProcessorNames = new ArrayList<>();
                        // 对后处理器分类处理
                        for (String ppName : postProcessorNames) {
                            if (isMatch(ppName, PriorityOrdered.class)) {
                                BeanFactoryPostProcessor pp = beanFactory.getBean(ppName, BeanFactoryPostProcessor.class);
                                priorityOrderedPostProcessors.add(pp);
                                if (pp instanceof MergedBeanDefinitionPostProccessor) {
                                    internalPostProcessor.add(pp);
                                }
                            } else if (isMatch(ppName, Ordered.class)) {
                                orderedPostProcessorNames.add(ppName);
                            } else {
                                nonOrderedPostProcessorNames.add(ppName);
                            } 
                        }
                        
                        // 按优先级排序
                        OrderComparator.sort(priorityOrderedPostProcessors);
                        registerBeanFactoryPostProcessors(beanFactory, priorityOrderedPostProcessors);
                        
                        // next, invoke the 
                        List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList<>();
                        for (String postProcessorName : orderedPostProcessorNames) {
                            BeanFactoryPostProcessor pp = beanFactory.getBean(ppName, BeanFactoryPostProcessor.class);
                            orderedPostProcessors.add(pp);
                            if (pp instanceof MergedBeanDefinitionPostProccessor) {
                                internalPostProcessor.add(pp);
                            }
                        }
                        OrderComparator.sort(orderedPostProcessors);
                        registerBeanFactoryPostProcessors(beanFactory, orderedPostProcessors);
                        
                        // 无序直接调用
                        List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList<>();
                        for (String postProcessorName : nonOrderedPostProcessorNames) {
                            BeanFactoryPostProcessor pp = beanFactory.getBean(ppName, BeanFactoryPostProcessor.class);
                            nonOrderedPostProcessors.add(pp);
                            if (pp instanceof MergedBeanDefinitionPostProccessor) {
                                internalPostProcessor.add(pp);
                            }
                        }
                        registerBeanFactoryPostProcessors(beanFactory, nonOrderedPostProcessors);
                        
                        // 注册所有的MergedBeanDefinitionPostProccessor类型的BeanPostProcessor
                        OrderComparator.sort(internalPostProcessor);
                        registerBeanFactoryPostProcessors(beanFactory, internalPostProcessor);
                        
                        // 添加ApplicationListener探测器
                        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector());
                    }
            
            |-- 6.6.3 初始化消息资源
                |-- 示例:
                    (1) Locale locale1 = new Locale("zh","CN"); // 带语言+国家/地区信息的
                    (2) Locale locale2 = new Locale("zh"); // 带语言
                    (3) Locale locale3 = Locale.CHINA; // 带语言+国家/地区信息的
                    (4) Locale locale4 = Locale.CHINESS; // 带语言
                    (5) Locale locale5 = Locale.getDefault(); // 系统默认的本地化对象 
                    pattern1 = "{0} hello!";
                    pattern2 = "{0} 你好!";
                    Object[] params = {"John"};
                    // 默认言语格式化
                    String msg1 = MessageFormat.format(pattern1, params);
                    // 指定言语格式化
                    MessageFormat mf = new MessageFormat(pattern2, Locale.US);
                    String msg2 = mf.format(params);
                |-- 如果使用
                    (1) 定义资源文件
                        |-- messages.properties
                            test=test
                        |-- messages_zh_CN.properties
                            test=测试
                    (2) 定义配置文件(id必须为messageSource)
                        <bean id="messageSource" class="">
                            <property name="basenames">
                                <list>
                                    <value>test/messages</value>
                                </list>
                            </property>
                        </bean>
                    (3) 使用。
                        String[] configs = {"applicationContext.xml"};
                        Application ctx = new ClassPathXmlApplicationContext(configs);
                        Object[] params = {"John"};
                        String str1 = ctx.getMessage("test", params, Locale.US);
                        String str2 = ctx.getMessage("test", params, Locale.CHINA);
                |-- 核心方法:
                    protected void initMessageSource() {
                        beanFactory = getBeanFactory();
                        if (beanFactory.containsLocalBean(MESSAGE_SOURCE_NAME)) {
                            this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_NAME, MessageSource.class);
                            if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
                                HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
                                if (hms.getParentMessageSource() == null) {
                                    hms.setParentMessageSource(getInteralParentMessageSource());
                                }
                            }
                        } else {
                            DelegatingMessageSource dms = new DelegatingMessageSource();
                            dms.setParentMessageSource(getInteralParentMessageSource());
                            this.messageSource = dms;
                            beanFactory.registerSingleton(MESSAGE_SOURCE_NAME, this.messageSource);
                            logger.info(...);
                        }
                    }
                    getMessage(String code, Object[] args, Locale locale) {
                        return getMessageSource().getMessage(code, args, locale);
                    }
            |-- 6.6.4 初始化ApplicationEventMulticaster
                |-- (1) 定义监听事件
                    |-- TestEvent extends ApplicationEvent {
                            String msg;
                            TestEvent(Object source) {
                                super(source);
                            }
                            TestEvent(Object source, String msg) {
                                super(source);
                                this.msg = msg;
                            }
                            print() {
                                sysout(msg);
                            }
                        }
                |-- (2) 定义监听器
                    |-- TestListener implements ApplicationListener {
                            onApplicationEvent(ApplicationEvent event) {
                                if (event instanceof TestEvent) {
                                    TestEvent testEvent = (TestEvent) event;
                                    testEvent.print();
                                }
                            }
                        }
                |-- (3) 添加配置文件
                    <bean id="testListener" class="com.test.event.TestListener"/>
                |-- (4) 测试
                    Test {
                        main(String[] args) {
                            ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
                            TestEvent event = new TestEvent("hello", "msg");
                            context.publishEvent(event);
                        }
                    }
                |-- 初始化ApplicationEventMulticaster
                    |-- initApplicationEventMulticaster() {
                            beanFactory = getBeanFactory();
                            if (beanFactory.containsLocalBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME)) {
                                this.applicationEventMulticaster = beanFactory.getBean(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, ApplicationEventMulticaster.class);
                                if (logger.isDebugEnable()) {
                                    logger.info(...);
                                }
                            } else {
                                this.applicationEventMulticaster = new SimpleApplicationEventMulticaster(beanFactory);
                                beanFactory.registerSingleton(APPLICATION_EVENT_MULTICASTER_BEAN_NAME, this.applicationEventMulticaster);
                                if (logger.isDebugEnable()) {
                                    logger.info(...);
                                }
                            }
                        }
                    |-- SimpleApplicationEventMulticaster {
                            public void multicastEvent(final ApplicationEvent event) {
                                for ( ApplicationListener listener : getApplicationListeners()) {
                                    Executor executor = getTaskExecutor();
                                    if (executor != null) {
                                        executor.execute(new Runnable(){
                                            run() {
                                                listener.onApplicationEvent(event);
                                            }
                                        });
                                    } else {
                                        listener.onApplicationEvent(event);
                                    }
                                }
                            }
                        }
            |-- 6.6.5 注册监听器
                |-- protected void registerListeners() {
                        for (ApplicationListener listener : getApplicationListeners()) {
                            getApplicationEventMulticaster().addApplicationListener(listener);
                        }
                        // 配置文件注册的监听器处理
                        String[] listenerBeanNames = getBeanNamesForType(ApplicationListener.class, true, false);
                        for (String listName : listenerBeanNames) {
                            getApplicationEventMulticaster().addApplicationListenerBean(listName);
                        }
                    }
        |-- 6.7 初始化非延迟加载单例
            |-- protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
                    // InitializingBean conversion service for this context.
                    if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) 
                            &&beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {
                        beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));
                    }
                    // InitializingBean LoadTimeWeaverAwareProcessor beans early to allow for registering their transformedBeanName early
                    String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
                    for (String weaverAwareName : weaverAwareNames) {
                        getBean(weaverAwareName);
                    }
                    
                    // Stop using the temporary ClassLoader for type matching.
                    beanFactory.setTempClassLoader(null);
                    // 冻结所有的bean定义,说明注册的bean定义将不被修改或任何进一步的处理
                }
待续。。。
原文地址:https://www.cnblogs.com/ice-line/p/9590842.html