Spring源码核心流程分析

经过一个多月的努力,我终于完成了对spring核心源码的阅读,其内部结构之巧妙令我大受震撼。本着趁热打铁的原则,我打算将一个多月的所学浓缩成这篇文章,给大家分享。 

在开始正式内容之前,我有两点前提要跟大家交代。首先,这篇文章是对spring核心源码的解读,因篇幅有限基础的spring知识我就不再赘述,对spring不了解的朋友们可能阅读起来比较吃力,建议先去学习spring的基础内容。其次,我想明确一下分析的粒度,相信大家都知道,spring是一个庞大的工程,面对成千上万行代码,任何人都不可能面面俱到,那么分析什么、分析到什么程度就显得尤为重要。本篇文章旨在从源码的角度为大家建立一个spring框架的整体运行流程结构,所以分析过程紧跟spring的主体运行过程走,与主体运行相关性不大的东西我们将会省略。就如同拆解一辆超级跑车,我们只带大家拆到发动机、轮子、变速箱,至于发动机中的齿轮、活塞、橡皮圈,就不在我们讨论的范围之内了。ok,话不多说,这就开始吧!

相信大家都知道spring有两大核心功能,ioc(控制反转 Inversion of Control) 和 aop(面向切面编程 Aspect Oriented Programming),让我们先从ioc开始对spring进行拆解。ioc的核心目的就是把对象(以下成为bean)的创建和管理交给spring容器来做,由此看来bean的创建是spring ioc功能的核心。那么bean的创建分为那几步呢?回想一下手动创建bean的过程,可以想到bean创建分为三大步,bean定义信息读取封装、bean实例化、初始化和内容填充。这仨大步又可拆分成若干小步,接下来将逐一讲解。

1.1容器的解读

容器是spring一切工作的基础,本文章将以spring最常用的容器ClassPathXmlApplicationContext为切入点进行讲解。容器的创建是一件非常简单的操作:

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("Context.xml"); 其中Context.xml为配置文件路径。

继续追入构造方法可以看到

public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, @Nullable ApplicationContext parent) throws BeansException {
    super(parent);
    this.setConfigLocations(configLocations);//设置配置文件地址
    if (refresh) {
//刷新容器,所有工作的重点
        this.refresh(); 
    }
}

进入refresh()方法,容器创建的相关工作一目了然:

public void refresh() throws BeansException, IllegalStateException {
    synchronized(this.startupShutdownMonitor) {


        StartupStep contextRefresh = this.applicationStartup.start("spring.context.refresh");
         //准备上下文环境
        this.prepareRefresh();

         // 获取bean工厂,bean创建有关的大部分工作都在beanfactory中完成,我们关心的bean定义信息的读取也在beanfactory创建时完成
        ConfigurableListableBeanFactory beanFactory = this.obtainFreshBeanFactory();

      //对beanfactory进行功能扩充
        this.prepareBeanFactory(beanFactory);
        

        try {

           //BeanFactory创建完成的后置处理器,留给用户重写方法
            this.postProcessBeanFactory(beanFactory);
            StartupStep beanPostProcess = this.applicationStartup.start("spring.context.beans.post-process");

//激活BeanFactory的后置处理器
            this.invokeBeanFactoryPostProcessors(beanFactory);

//注册bean的后置处理器(前者是BeanFactory创建完成后调用,后者是BeanFactory中的bean加载完成后调用,这里仅是注册)
            this.registerBeanPostProcessors(beanFactory);

//结束后置处理流程
            beanPostProcess.end();

//初始化消息源
            this.initMessageSource();

//初始化消息广播器,默认由applicationEventMulticaster负责消息广播
            this.initApplicationEventMulticaster();

//留给子类实现功能
            this.onRefresh();

//注册所有事件监听器
            this.registerListeners();

//初始化剩下的单实例bean(多实例bean不在容器创建时实例化),我们将从这一步为出发点分析bean的实例化过程
            this.finishBeanFactoryInitialization(beanFactory);

//完成刷新过程,发出ContextRefreshEvent事件
            this.finishRefresh();
        } catch (BeansException var10) {
            if (this.logger.isWarnEnabled()) {
                this.logger.warn("Exception encountered during context initialization - cancelling refresh attempt: " + var10);
            }

//出现问题销毁 

            this.destroyBeans();
            this.cancelRefresh(var10);

            throw var10;
        } finally {
            this.resetCommonCaches();
            contextRefresh.end();
        }

    }
}

这里还有一张图辅助了解refresh的全过程

1.2bean配置信息的读取

让我们追入第一处标红的方法obtainFreshBeanFactory()

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
    this.refreshBeanFactory();
    return this.getBeanFactory();
}

追入refreshBeanFactory( ) 方法

protected final void refreshBeanFactory() throws BeansException {
    if (this.hasBeanFactory()) {
        this.destroyBeans();
        this.closeBeanFactory();
    }

    try {
//创建bean工厂
        DefaultListableBeanFactory beanFactory = this.createBeanFactory();
//设置序列化ID
        beanFactory.setSerializationId(this.getId());
//对创建好的bean工厂进行定制,可自主实现功能增强
        this.customizeBeanFactory(beanFactory);
//加载bean定义信息,重点
        this.loadBeanDefinitions(beanFactory);
        this.beanFactory = beanFactory;
    } catch (IOException var2) {
        throw new ApplicationContextException("I/O error parsing bean definition source for " + this.getDisplayName(), var2);
    }
}

继续进入bean定义信息加载方法loadBeanDefinitions()

protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) {
//加载bean定义信息的读取器,因为bean定义信息使用xml文件保存,故加载的是xmlBeanDefinitionReader,bean定义信息的读取将由读取器负责XmlBeanDefinitionReader beanDefinitionReader = newXmlBeanDefinitionReader(beanFactory);
//设置环境
    beanDefinitionReader.setEnvironment(this.getEnvironment());
//设置资源加载器
    beanDefinitionReader.setResourceLoader(this);
//设置内容解析器
    beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));
//初始化加载器
    this.initBeanDefinitionReader(beanDefinitionReader);
//开始读取bean定义信息
    this.loadBeanDefinitions(beanDefinitionReader);
}

XmlBeanDefinitionReader中的loadBeanDefinitions(EncodedResource encodedResource)方法负责读取bean定义信息

截取其中的一小段代码:

//创建输入流
InputSource inputSource = new InputSource(inputStream);
if (encodedResource.getEncoding() != null) {
//设置字符编码
    inputSource.setEncoding(encodedResource.getEncoding());
}
//根据输入流加载bean定义信息,var6为加载的bean定义系信息总数
var6 = this.doLoadBeanDefinitions(inputSource, encodedResource.getResource());

追入doLoadBeanDefinitions()方法

protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException {
    try {
//配置文件被封装为文档对象Document
        Document doc = this.doLoadDocument(inputSource, resource);
//根据文档对象注册bean定义信息
        int count = this.registerBeanDefinitions(doc, resource);
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Loaded " + count + " bean definitions from " + resource);
        }
return count;

...}

至此我们可以看到,bean定义信息被封装为BeanDefinition对象,在bean工厂中保存,BeanDefinition加载的具体过程为:先由输入数据流InputSource读入配置文件,再封装为Document对象,再由Document对象依次注册bean定义信息BeanDefinition。这就是bean定义信息加载的全部过程,下面对两个关键对象Document和BeanDefinition的关键信息进行展示

 Document:

public class DeferredDocumentImpl extends DocumentImpl implements DeferredNode {

...

    //
    // Data
    //

    /** Node count. */
    protected transient int fNodeCount = 0;

    /** Node types. */
    protected transient int fNodeType[][];

    /** Node names. */
    protected transient Object fNodeName[][];

    /** Node values. */
    protected transient Object fNodeValue[][];

    /** Node parents. */
    protected transient int fNodeParent[][];

    /** Node first children. */
    protected transient int fNodeLastChild[][];

    /** Node prev siblings. */
    protected transient int fNodePrevSib[][];

    /** Node namespace URI. */
    protected transient Object fNodeURI[][];

    /** Extra data. */
    protected transient int fNodeExtra[][];

    /** Identifier count. */
    protected transient int fIdCount;

    /** Identifier name indexes. */
    protected transient String fIdName[];

    /** Identifier element indexes. */
    protected transient int fIdElement[];

    /** DOM2: For namespace support in the deferred case.
     */
    // Implementation Note: The deferred element and attribute must know how to
    // interpret the int representing the qname.
    protected boolean fNamespacesEnabled = false;

    //
    // private data
    //
    private transient final StringBuilder fBufferStr = new StringBuilder();
    private transient final ArrayList fStrChunks = new ArrayList();

    //
    // Constructors
    //

    /**
     * NON-DOM: Actually creating a Document is outside the DOM's spec,
     * since it has to operate in terms of a particular implementation.
     */
    public DeferredDocumentImpl() {
        this(false);
    } // <init>()

    /**
     * NON-DOM: Actually creating a Document is outside the DOM's spec,
     * since it has to operate in terms of a particular implementation.
     */
    public DeferredDocumentImpl(boolean namespacesEnabled) {
        this(namespacesEnabled, false);
...

BeanDefinition各种有关bean的信息一目了然:

public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor implements BeanDefinition, Cloneable {
...
    @Nullable
    private volatile Object beanClass;
    @Nullable
    private String scope;
    private boolean abstractFlag;
    @Nullable
    private Boolean lazyInit;
    private int autowireMode;
    private int dependencyCheck;
    @Nullable
    private String[] dependsOn;
    private boolean autowireCandidate;
    private boolean primary;
    private final Map<String, AutowireCandidateQualifier> qualifiers;
    @Nullable
    private Supplier<?> instanceSupplier;
    private boolean nonPublicAccessAllowed;
    private boolean lenientConstructorResolution;
    @Nullable
    private String factoryBeanName;
    @Nullable
    private String factoryMethodName;
    @Nullable
    private ConstructorArgumentValues constructorArgumentValues;
    @Nullable
    private MutablePropertyValues propertyValues;
    private MethodOverrides methodOverrides;
    @Nullable
    private String initMethodName;
    @Nullable
    private String destroyMethodName;
    private boolean enforceInitMethod;
    private boolean enforceDestroyMethod;
    private boolean synthetic;
    private int role;
    @Nullable
    private String description;
    @Nullable
    private Resource resource;

    protected AbstractBeanDefinition() {
        this((ConstructorArgumentValues)null, (MutablePropertyValues)null);
    }

    protected AbstractBeanDefinition(@Nullable ConstructorArgumentValues cargs, @Nullable MutablePropertyValues pvs) {
        this.scope = "";
        this.abstractFlag = false;
        this.autowireMode = 0;
        this.dependencyCheck = 0;
        this.autowireCandidate = true;
        this.primary = false;
        this.qualifiers = new LinkedHashMap();
        this.nonPublicAccessAllowed = true;
        this.lenientConstructorResolution = true;
        this.methodOverrides = new MethodOverrides();
        this.enforceInitMethod = true;
        this.enforceDestroyMethod = true;
        this.synthetic = false;
        this.role = 0;
        this.constructorArgumentValues = cargs;
        this.propertyValues = pvs;
    }
...

1.3bean实例化

bean定义信息加载以后就进入了第二个阶段,根据配置信息创建对应的bean。追入第二个标红的方法finishBeanFactoryInitialization(beanFactory)中。

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
    if (beanFactory.containsBean("conversionService") && beanFactory.isTypeMatch("conversionService", ConversionService.class)) {
        beanFactory.setConversionService((ConversionService)beanFactory.getBean("conversionService", ConversionService.class));
    }

    if (!beanFactory.hasEmbeddedValueResolver()) {
        beanFactory.addEmbeddedValueResolver((strVal) -> {
            return this.getEnvironment().resolvePlaceholders(strVal);
        });
    }
//拿到所有要初始化的LoadTimeWeaverAwareBean(一种特殊的bean,此处以它为切入点分析bean实例化流程)的名字
    String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);
    String[] var3 = weaverAwareNames;
    int var4 = weaverAwareNames.length;

    for(int var5 = 0; var5 < var4; ++var5) {
        String weaverAwareName = var3[var5];
//调用getBean方法,BeanFactory().getBean()方法会在第一次获取bean的时候自动完成bean的实例化工作
        this.getBean(weaverAwareName);
    }

    beanFactory.setTempClassLoader((ClassLoader)null);
//冻结bean定义信息
    beanFactory.freezeConfiguration();
//实例化下的bean,过程于上边类似都是调用getbean()方法
    beanFactory.preInstantiateSingletons();
}

追入getbean()

public Object getBean(String name) throws BeansException {
    this.assertBeanFactoryActive();
    return this.getBeanFactory().getBean(name);
}

可以清楚地看到调用了BeanFactory的getBean()方法

继续追入

public Object getBean(String name) throws BeansException {
    return this.doGetBean(name, (Class)null, (Object[])null, false);
}

由此看到bean实例化的关键内容都在doGetBean()方法中呈现

此方法代码较长,其中共有四处创建bean实例的地方(红色标出)重点关注此处即可

protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {
    String beanName = this.transformedBeanName(name);
//尝试从缓存中获得bean实例,如果缓存中有,则无需创建,
这里要指出的是此处获得的只是bean的实例,不是要返回的bean对象,
因为bean实例可能是beanfactory类,对于beanfactory类,在其中创建的bean才是我们真正想要返回的bean
    Object sharedInstance = this.getSingleton(beanName);
    Object beanInstance;
    if (sharedInstance != null && args == null) {
        if (this.logger.isTraceEnabled()) {
            if (this.isSingletonCurrentlyInCreation(beanName)) {
                this.logger.trace("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference");
            } else {
                this.logger.trace("Returning cached instance of singleton bean '" + beanName + "'");
            }
        }
//对bean实例的检测处理,如果bean实例是beanfactory类则调用getbean()方法拿到真正要返回的bean
        beanInstance = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);
    } else {
        if (this.isPrototypeCurrentlyInCreation(beanName)) {
            throw new BeanCurrentlyInCreationException(beanName);
        }

        BeanFactory parentBeanFactory = this.getParentBeanFactory();
        if (parentBeanFactory != null && !this.containsBeanDefinition(beanName)) {
            String nameToLookup = this.originalBeanName(name);
            if (parentBeanFactory instanceof AbstractBeanFactory) {
                return ((AbstractBeanFactory)parentBeanFactory).doGetBean(nameToLookup, requiredType, args, typeCheckOnly);
            }

            if (args != null) {
                return parentBeanFactory.getBean(nameToLookup, args);
            }

            if (requiredType != null) {
                return parentBeanFactory.getBean(nameToLookup, requiredType);
            }

            return parentBeanFactory.getBean(nameToLookup);
        }

        if (!typeCheckOnly) {
            this.markBeanAsCreated(beanName);
        }

        StartupStep beanCreation = this.applicationStartup.start("spring.beans.instantiate").tag("beanName", name);

        try {
            if (requiredType != null) {
                beanCreation.tag("beanType", requiredType::toString);
            }

            RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);
            this.checkMergedBeanDefinition(mbd, beanName, args);
            String[] dependsOn = mbd.getDependsOn();
            String[] var12;
            if (dependsOn != null) {
                var12 = dependsOn;
                int var13 = dependsOn.length;

                for(int var14 = 0; var14 < var13; ++var14) {
                    String dep = var12[var14];
                    if (this.isDependent(beanName, dep)) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
                    }

                    this.registerDependentBean(dep, beanName);

                    try {
                        this.getBean(dep);
                    } catch (NoSuchBeanDefinitionException var31) {
                        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "'" + beanName + "' depends on missing bean '" + dep + "'", var31);
                    }
                }
            }

            if (mbd.isSingleton()) {
//获取单实例bean,真正创建bean的方法是回调函数中的createbean
                sharedInstance = this.getSingleton(beanName, () -> {
                    try {
                        return this.createBean(beanName, mbd, args);
                    } catch (BeansException var5) {
                        this.destroySingleton(beanName);
                        throw var5;
                    }
                });
//对新创建的bean的检测
                beanInstance = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
            } else if (mbd.isPrototype()) {
                var12 = null;

                Object prototypeInstance;
                try {
                    this.beforePrototypeCreation(beanName);
//多实例bean的创建,也是调用createbean()方法
                    prototypeInstance = this.createBean(beanName, mbd, args);
                } finally {
                    this.afterPrototypeCreation(beanName);
                }
//对新创建的bean的检测
                beanInstance = this.getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
            } else {
                String scopeName = mbd.getScope();
                if (!StringUtils.hasLength(scopeName)) {
                    throw new IllegalStateException("No scope name defined for bean '" + beanName + "'");
                }

                Scope scope = (Scope)this.scopes.get(scopeName);
                if (scope == null) {
                    throw new IllegalStateException("No Scope registered for scope name '" + scopeName + "'");
                }

                try {
                    Object scopedInstance = scope.get(beanName, () -> {
                        this.beforePrototypeCreation(beanName);

                        Object var4;
                        try {
//创建其他作用范围上的bean实例
                            var4 = this.createBean(beanName, mbd, args);
                        } finally {
                            this.afterPrototypeCreation(beanName);
                        }

                        return var4;
                    });
//对新创建的bean的检测
                    beanInstance = this.getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                } catch (IllegalStateException var30) {
                    throw new ScopeNotActiveException(beanName, scopeName, var30);
                }
            }
        } catch (BeansException var32) {
            beanCreation.tag("exception", var32.getClass().toString());
            beanCreation.tag("message", String.valueOf(var32.getMessage()));
            this.cleanupAfterBeanCreationFailure(beanName);
            throw var32;
        } finally {
            beanCreation.end();
        }
    }

    return this.adaptBeanInstance(name, beanInstance, requiredType);
}

我们看到,此方法中把bean实例的创建分为了四种,从缓存中获得,创建单实例bean实例,创建多实例bean实例,创建其他作用范围的bean实例。在每一个实例创建好后都调用了getObjectForBeanInstance方法检测。继续追入createbean方法。

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
    if (this.logger.isTraceEnabled()) {
        this.logger.trace("Creating instance of bean '" + beanName + "'");
    }

    RootBeanDefinition mbdToUse = mbd;
    Class<?> resolvedClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
        mbdToUse = new RootBeanDefinition(mbd);
        mbdToUse.setBeanClass(resolvedClass);
    }

    try {
//准备重写方法,spring允许你在配置文件中指定bean中方法的重写方法,此处在为此做准备
        mbdToUse.prepareMethodOverrides();
    } catch (BeanDefinitionValidationException var9) {
        throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), beanName, "Validation of method overrides failed", var9);
    }

    Object beanInstance;
    try {
//BeanPostProcessors一个机会来返回代理对象替代真正的实例,用于功能扩展增强
        beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
        if (beanInstance != null) {
            return beanInstance;
        }
    } catch (Throwable var10) {
        throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var10);

    } 

    try {
//真正创建bean实例
        beanInstance = this.doCreateBean(beanName, mbdToUse, args);
        if (this.logger.isTraceEnabled()) {
            this.logger.trace("Finished creating instance of bean '" + beanName + "'");
        }

        return beanInstance;
    } catch (ImplicitlyAppearedSingletonException | BeanCreationException var7) {
        throw var7;
    } catch (Throwable var8) {
        throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", var8);
    }
}

进入doCreateBean

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {
    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {
        instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
    }

    if (instanceWrapper == null) {
//创建bean实例
        instanceWrapper = this.createBeanInstance(beanName, mbd, args);
    }

    Object bean = instanceWrapper.getWrappedInstance();
    Class<?> beanType = instanceWrapper.getWrappedClass();
    if (beanType != NullBean.class) {
        mbd.resolvedTargetType = beanType;
    }

    synchronized(mbd.postProcessingLock) {
        if (!mbd.postProcessed) {
            try {
                this.applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
            } catch (Throwable var17) {
                throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Post-processing of merged bean definition failed", var17);
            }

            mbd.postProcessed = true;
        }
    }

    boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);
    if (earlySingletonExposure) {
        if (this.logger.isTraceEnabled()) {
            this.logger.trace("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
        }

        this.addSingletonFactory(beanName, () -> {
            return this.getEarlyBeanReference(beanName, mbd, bean);
        });
    }

    Object exposedObject = bean;

    try {
//填充创建好的bean实例的属性,ioc分析的第三大步,内容填充将在此展开 
        this.populateBean(beanName, mbd, instanceWrapper);
//初始化bean, Aop过程在其中进行(以后会详细说明不用纠结)
        exposedObject = this.initializeBean(beanName, exposedObject, mbd);
    } catch (Throwable var18) {
        if (var18 instanceof BeanCreationException && beanName.equals(((BeanCreationException)var18).getBeanName())) {
            throw (BeanCreationException)var18;
        }

        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Initialization of bean failed", var18);
    }

    if (earlySingletonExposure) {
        Object earlySingletonReference = this.getSingleton(beanName, false);
        if (earlySingletonReference != null) {
            if (exposedObject == bean) {
                exposedObject = earlySingletonReference;
            } else if (!this.allowRawInjectionDespiteWrapping && this.hasDependentBean(beanName)) {
                String[] dependentBeans = this.getDependentBeans(beanName);
                Set<String> actualDependentBeans = new LinkedHashSet(dependentBeans.length);
                String[] var12 = dependentBeans;
                int var13 = dependentBeans.length;

                for(int var14 = 0; var14 < var13; ++var14) {
                    String dependentBean = var12[var14];
                    if (!this.removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
                        actualDependentBeans.add(dependentBean);
                    }
                }

                if (!actualDependentBeans.isEmpty()) {
                    throw new BeanCurrentlyInCreationException(beanName, "Bean with name '" + beanName + "' has been injected into other beans [" + StringUtils.collectionToCommaDelimitedString(actualDependentBeans) + "] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesForType' with the 'allowEagerInit' flag turned off, for example.");
                }
            }
        }
    }

    try {
        this.registerDisposableBeanIfNecessary(beanName, bean, mbd);
        return exposedObject;
    } catch (BeanDefinitionValidationException var16) {
        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Invalid destruction signature", var16);
    }
}

此方法中有两个值得我们关注的地方,一个是createBeanInstance创建bean实例,一个是populateBean填充bean属性

先进入createBeanInstance

protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    Class<?> beanClass = this.resolveBeanClass(mbd, beanName, new Class[0]);
    if (beanClass != null && !Modifier.isPublic(beanClass.getModifiers()) && !mbd.isNonPublicAccessAllowed()) {
        throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Bean class isn't public, and non-public access not allowed: " + beanClass.getName());
    } else {
        Supplier<?> instanceSupplier = mbd.getInstanceSupplier();
        if (instanceSupplier != null) {
            return this.obtainFromSupplier(instanceSupplier, beanName);
        } else if (mbd.getFactoryMethodName() != null) {
            return this.instantiateUsingFactoryMethod(beanName, mbd, args);
        } else {
            boolean resolved = false;
            boolean autowireNecessary = false;
            if (args == null) {
                synchronized(mbd.constructorArgumentLock) {
//bean有多组构造器,需要根据传入参数选择合适构造器
                    if (mbd.resolvedConstructorOrFactoryMethod != null) {
//判断构造器是否已经被解析
                        resolved = true;
                        autowireNecessary = mbd.constructorArgumentsResolved;
                    }
                }
            }
//如果构造器已经被解析,判断构造器是否需要自动参数填充,如果需要则调用autowireConstructor方法进行创建,如果不需要则调用instantiateBean进行默认创建
            if (resolved) {
                return autowireNecessary ? this.autowireConstructor(beanName, mbd, (Constructor[])null, (Object[])null) : this.instantiateBean(beanName, mbd);
            } else {
//构造器未被解析则首先选择合适的构造器
                Constructor<?>[] ctors = this.determineConstructorsFromBeanPostProcessors(beanClass, beanName);
                if (ctors == null && mbd.getResolvedAutowireMode() != 3 && !mbd.hasConstructorArgumentValues() && ObjectUtils.isEmpty(args)) {
                    ctors = mbd.getPreferredConstructors();
//有适合的构造器则调用autowireConstructor进行创建,没有则使用默认创建
                    return ctors != null ? this.autowireConstructor(beanName, mbd, ctors, (Object[])null) : this.instantiateBean(beanName, mbd);
                } else {
//其他情况直接使用autowireConstructor创建
                    return this.autowireConstructor(beanName, mbd, ctors, args);
                }
            }
        }
    }
}

spring将创建实例分为了两种,一种是默认实例化,一种是带有参数的实例化,默认实例化对应instantiateBean方法,带有参数的实例化对应autowireConstructor方法。createBeanInstance方法中根据不同条件选用二者之一进行实例创建。

1.4bean属性填充

完成bean实例创建以后紧接着要做的就是对bean的各种属性进行填充,此步骤在函数populateBean中完成,追入函数可看到属性填充的两个关键方法autowireByName和autowireByType

protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
    if (bw == null) {
        if (mbd.hasPropertyValues()) {
            throw new BeanCreationException(mbd.getResourceDescription(), beanName, "Cannot apply property values to null instance");
        }
    } else {
        if (!mbd.isSynthetic() && this.hasInstantiationAwareBeanPostProcessors()) {
            Iterator var4 = this.getBeanPostProcessorCache().instantiationAware.iterator();

            while(var4.hasNext()) {
                InstantiationAwareBeanPostProcessor bp = (InstantiationAwareBeanPostProcessor)var4.next();
                if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
                    return;
                }
            }
        }

        PropertyValues pvs = mbd.hasPropertyValues() ? mbd.getPropertyValues() : null;
        int resolvedAutowireMode = mbd.getResolvedAutowireMode();
        if (resolvedAutowireMode == 1 || resolvedAutowireMode == 2) {
            MutablePropertyValues newPvs = new MutablePropertyValues((PropertyValues)pvs);
            if (resolvedAutowireMode == 1) {
//根据名字自动填充,将解析出来要填充的内容保存到MutablePropertyValues(newPvs)中
                this.autowireByName(beanName, mbd, bw, newPvs);
            }
//根据类型自动填充,其他操作同上
            if (resolvedAutowireMode == 2) {

                this.autowireByType(beanName, mbd, bw, newPvs);
            }

            pvs = newPvs;
        }

        boolean hasInstAwareBpps = this.hasInstantiationAwareBeanPostProcessors();
        boolean needsDepCheck = mbd.getDependencyCheck() != 0;
        PropertyDescriptor[] filteredPds = null;
        if (hasInstAwareBpps) {
            if (pvs == null) {
                pvs = mbd.getPropertyValues();
            }

            PropertyValues pvsToUse;
            for(Iterator var9 = this.getBeanPostProcessorCache().instantiationAware.iterator(); var9.hasNext(); pvs = pvsToUse) {
                InstantiationAwareBeanPostProcessor bp = (InstantiationAwareBeanPostProcessor)var9.next();
                pvsToUse = bp.postProcessProperties((PropertyValues)pvs, bw.getWrappedInstance(), beanName);
                if (pvsToUse == null) {
                    if (filteredPds == null) {
                        filteredPds = this.filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
                    }

                    pvsToUse = bp.postProcessPropertyValues((PropertyValues)pvs, filteredPds, bw.getWrappedInstance(), beanName);
                    if (pvsToUse == null) {
                        return;
                    }
                }
            }
        }

        if (needsDepCheck) {
            if (filteredPds == null) {
                filteredPds = this.filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
            }

            this.checkDependencies(beanName, mbd, filteredPds, (PropertyValues)pvs);
        }

        if (pvs != null) {
//解析出来的属性填充到bean中
            this.applyPropertyValues(beanName, mbd, bw, (PropertyValues)pvs);
        }

    }
}

继续进入autowireByName方法

protected void autowireByName(String beanName, AbstractBeanDefinition mbd, BeanWrapper bw, MutablePropertyValues pvs) {
//找出需要注入的属性名字
    String[] propertyNames = this.unsatisfiedNonSimpleProperties(mbd, bw);
    String[] var6 = propertyNames;
    int var7 = propertyNames.length;

    for(int var8 = 0; var8 < var7; ++var8) {
        String propertyName = var6[var8];
        if (this.containsBean(propertyName)) {
//创建要注入的属性
            Object bean = this.getBean(propertyName);
//保存属性到MutablePropertyValues中
            pvs.add(propertyName, bean);
            this.registerDependentBean(propertyName, beanName);
            if (this.logger.isTraceEnabled()) {
                this.logger.trace("Added autowiring by name from bean name '" + beanName + "' via property '" + propertyName + "' to bean named '" + propertyName + "'");
            }
        } else if (this.logger.isTraceEnabled()) {
            this.logger.trace("Not autowiring property '" + propertyName + "' of bean '" + beanName + "' by name: no matching bean found");
        }
    }

}

autowireByType方法过程相似,此处不再赘述。至此,springIOC有关功能的核心流程都已分析结束,下面将进入Aop有关流程的源码分析。

经过千山万水我们终于分析完了bean创建的所有流程,但是至此spring容器的所有工作流程都结束了吗?很遗憾,并没有。因为spring容器还为我们提供了另一个重要的功能——Aop(Aspect Oriented Programming)面向切面编程,它允许我们动态的将代码切入到目标方法中去。篇幅原因有关Aop的基础知识我也不再赘述,我们重点关注spring是如何实现Aop功能的。   相信你也有所耳闻,spring实现Aop的方法就是创建动态代理,简而言之就是为被代理对象创建子类,在子类中重写被增强的方法,将其改为先执行增强逻辑,再执行原有逻辑。而spring实现动态代理的两种方式是CGLIB动态代理和JDK动态代理。

上述Aop过程还有一个小问题,就是什么时候、怎么创建动态代理?由于Aop是基于原有逻辑进行增强,所以动态代理的创建时机一定是原始bean初始化完成以后,至于如何创建,不知你是否记得bean创建过程中有许许多多的后置处理器,spring选用了初始化完成的后置处理器,在其中完成了对原始bean的Aop代理对象的创建

让我们在回顾一下创建bean的doCreateBean方法

追入 initializeBean

protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    if (System.getSecurityManager() != null) {
        AccessController.doPrivileged(() -> {
            this.invokeAwareMethods(beanName, bean);
            return null;
        }, this.getAccessControlContext());
    } else {
        this.invokeAwareMethods(beanName, bean);
    }

    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
//应用初始化的前置处理器
        wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
    }

    try {
//调用bean的初始化方法(可以在配置文件中配置)
        this.invokeInitMethods(beanName, wrappedBean, mbd);
    } catch (Throwable var6) {
        throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", var6);
    }

//初始化完成的后置处理器,spring会在容器中加入一个支持Aop功能的后置处理器,所有Aop有关功能都会在后置处理器中完成
    if (mbd == null || !mbd.isSynthetic()) {
        wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    }

    return wrappedBean;
}

我们找到spring创建的这个特殊后置处理器AnnotationAwareAspectJAutoProxyCreator

 

在类层次中我们可以看到它实现了BeanPostProcessor接口,找到父类AbstractAutoProxyCreator中实现了方法postProcessAfterInitialization,至此Aop源码分析正式开始。

public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
    if (bean != null) {
        Object cacheKey = this.getCacheKey(bean.getClass(), beanName);
        if (this.earlyProxyReferences.remove(cacheKey) != bean) {
//如果bean适合被代理,那么返回代理的bean
            return this.wrapIfNecessary(bean, beanName, cacheKey);
        }
    }

    return bean;
}

继续追入wrapIfNecessary方法

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
//如果已经进行过处理,则直接返回
    if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
        return bean;
//没有增强器,无需增强直接返回
    } else if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
        return bean;
    } else if (!this.isInfrastructureClass(bean.getClass()) && !this.shouldSkip(bean.getClass(), beanName)) {
//拿到目标bean的所有增强器
        Object[] specificInterceptors = this.getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, (TargetSource)null);
        if (specificInterceptors != DO_NOT_PROXY) {
            this.advisedBeans.put(cacheKey, Boolean.TRUE);
//创建代理对象
            Object proxy = this.createProxy(bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
            this.proxyTypes.put(cacheKey, proxy.getClass());
            return proxy;
        } else {
            this.advisedBeans.put(cacheKey, Boolean.FALSE);
            return bean;
        }
    } else {
        this.advisedBeans.put(cacheKey, Boolean.FALSE);
        return bean;
    }
}

wrapIfNecessary先通过getAdvicesAndAdvisorsForBean方法找到了所有的增强器,再通过creatProxy方法完成了代理对象的创建,将增强代码织入到了目标方法中,让我们先进入getAdvicesAndAdvisorsForBean小看一眼。

protected Object[] getAdvicesAndAdvisorsForBean(Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {
//找到所有合适的增强器
    List<Advisor> advisors = this.findEligibleAdvisors(beanClass, beanName);
    return advisors.isEmpty() ? DO_NOT_PROXY : advisors.toArray();
}
protected List<Advisor> findEligibleAdvisors(Class<?> beanClass, String beanName) {
//找到所有候选增强器
    List<Advisor> candidateAdvisors = this.findCandidateAdvisors();
//根据规则挑选能够应用在目标方法上的增强器
    List<Advisor> eligibleAdvisors = this.findAdvisorsThatCanApply(candidateAdvisors, beanClass, beanName);
    this.extendAdvisors(eligibleAdvisors);
    if (!eligibleAdvisors.isEmpty()) {
        eligibleAdvisors = this.sortAdvisors(eligibleAdvisors);
    }

    return eligibleAdvisors;
}

增强器的具体查找封装逻辑都在这两个方法中,感兴趣的朋友可自行阅读。

接着进入creatProxy方法查看创建代理逻辑。

protected Object createProxy(Class<?> beanClass, @Nullable String beanName, @Nullable Object[] specificInterceptors, TargetSource targetSource) {
    if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
        AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory)this.beanFactory, beanName, beanClass);
    }
//创建代理工厂,代理类将在代理工厂中创建
    ProxyFactory proxyFactory = new ProxyFactory();
    proxyFactory.copyFrom(this);
    if (proxyFactory.isProxyTargetClass()) {
        if (Proxy.isProxyClass(beanClass) || ClassUtils.isLambdaClass(beanClass)) {
            Class[] var6 = beanClass.getInterfaces();
            int var7 = var6.length;

            for(int var8 = 0; var8 < var7; ++var8) {
                Class<?> ifc = var6[var8];
                proxyFactory.addInterface(ifc);
            }
        }
    } else if (this.shouldProxyTargetClass(beanClass, beanName)) {
        proxyFactory.setProxyTargetClass(true);
    } else {
        this.evaluateProxyInterfaces(beanClass, proxyFactory);
    }

    Advisor[] advisors = this.buildAdvisors(beanName, specificInterceptors);
//在工厂中加入增强器
    proxyFactory.addAdvisors(advisors);
//设置代理源(目标方法)
    proxyFactory.setTargetSource(targetSource);
//定制代理
    this.customizeProxyFactory(proxyFactory);
//是否冻结配置,也就是之后是否还允许修改配置信息
    proxyFactory.setFrozen(this.freezeProxy);
    if (this.advisorsPreFiltered()) {
        proxyFactory.setPreFiltered(true);
    }

    ClassLoader classLoader = this.getProxyClassLoader();
    if (classLoader instanceof SmartClassLoader && classLoader != beanClass.getClassLoader()) {
        classLoader = ((SmartClassLoader)classLoader).getOriginalClassLoader();
    }
//让代理bean工厂开始创建代理bean
    return proxyFactory.getProxy(classLoader);
}

此方法是对ProxyFactory的一些属性设置,真正的代理对象创建委托给了proxyFactory的getProxy方法来做,继续进入proxyFactory.getProxy方法

public Object getProxy(@Nullable ClassLoader classLoader) {
    return this.createAopProxy().getProxy(classLoader);
}

无需多言继续追入

protected final synchronized AopProxy createAopProxy() {
    if (!this.active) {
        this.activate();
    }
    return this.getAopProxyFactory().createAopProxy(this);
}
public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
//如果符合Jdk代理规则优先使用Jdk代理
    if (NativeDetector.inNativeImage() || !config.isOptimize() && //不是针对目标对象类的代理!config.isProxyTargetClass() && //存在可以代理的接口!this.hasNoUserSuppliedProxyInterfaces(config)) {
//返回Jdk代理结果
        return new JdkDynamicAopProxy(config);
    } else {
        Class<?> targetClass = config.getTargetClass();
        if (targetClass == null) {
            throw new AopConfigException("TargetSource cannot determine target class: Either an interface or a target is required for proxy creation.");
        } else {
//返回CGLib代理结果
            return (AopProxy)(!targetClass.isInterface() && !Proxy.isProxyClass(targetClass) && !ClassUtils.isLambdaClass(targetClass) ? new ObjenesisCglibAopProxy(config) : new JdkDynamicAopProxy(config));
        }
    }
}

我们知道Jdk代理只能针对实现了接口的类,如果被代理类没有实现接口那么只能选用Cglib进行动态代理。所以此方法中根据不同条件选用了不同种代理的创建策略,最终完成了AOP代理类的创建,至此spring Aop的主要流程均已完成。

终于,spring容器的两大核心功能IOC和AOP都已分析完毕,至此关于spring源码的分析就可告一段落了。在流程分析的过程中相信你也有所感悟,分析spring源码就像在剥洋葱,从内到外把一个复杂的功能一层一层的拆解,繁而不杂,大而不乱。如此巧妙的设计让人叹为观止,不得不佩服开发人员技术水之高。以后有机会我会分享更多源码的解读(springmvc、springboot、mybatis..),希望能和大家一同学习,一同进步!

创作过程难免有所纰漏,请大家指正!

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值