Spring bean的初始化

 2023-02-09
原文作者:mule107323 原文地址:https://juejin.cn/post/7008188960409124878

博客索引

话不多说,先给出结论。本篇文章只谈论BeanPostProcessor类的先后执行关系。

bean的具体实例化过程过于复杂,有兴趣了解的建议参考书籍《Spring源码深度分析》

  1. org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

  2. org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization

  3. org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors

  4. org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition

  5. org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference

  6. org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

  7. org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessProperties

  8. org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor#postProcessPropertyValues(7执行后为null才执行8)

  9. org.springframework.beans.factory.config.BeanPostProcessor#postProcessBeforeInitialization

    invokeInitMethods(扩展方法)

    9.1 实现了InitializingBean接口的afterPropertiesSet()方法

    9.2 调用initMethod()方法

  10. org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization

  11. 扩展方法 处理实现DisposableBean接口

示例代码去掉日志以及一些与分析无关的

由于代码太多,所以只挑出关键代码,如果有兴趣,照着文章debug一遍即可明白流程。

org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)

    
    @Override
    
    public Object getBean(String name) throws BeansException {
    
        return doGetBean(name, null, null, false);
    
    }

然后进入org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean

    
    protected <T> T doGetBean(
    
    String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
    
    throws BeansException {
    
    String beanName = transformedBeanName(name);
    
    Object bean;
    
    
    
    // Eagerly check singleton cache for manually registered singletons.
    
    Object sharedInstance = getSingleton(beanName);
    
    if (sharedInstance != null && args == null) {
    
    bean = getObjectForBeanInstance(sharedInstance, name, beanName, null);
    
    }
    
    
    
    else {
    
    // 循环依赖,会抛出异常
    
    if (isPrototypeCurrentlyInCreation(beanName)) {
    
    throw new BeanCurrentlyInCreationException(beanName);
    
    }
    
    
    
    // Check if bean definition exists in this factory.
    
    BeanFactory parentBeanFactory = getParentBeanFactory();
    
    ····
    
    
    
    if (!typeCheckOnly) {
    
    markBeanAsCreated(beanName);
    
    }
    
    
    
    try {
    
    RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
    
    checkMergedBeanDefinition(mbd, beanName, args);
    
    ···
    
    // Create bean instance.
    
    // 创建bean实例,重点从这里开始分析
    
    if (mbd.isSingleton()) {
    
    sharedInstance = getSingleton(beanName, () -> {
    
    try {
    
    // 重点代码在这里
    
    return createBean(beanName, mbd, args);
    
    }
    
    catch (BeansException ex) {
    
    destroySingleton(beanName);
    
    throw ex;
    
    }
    
    });
    
    bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
    
    }
    
    
    }
    
    
    
    // Check if required type matches the type of the actual bean instance.
    
    if (requiredType != null && !requiredType.isInstance(bean)) {
    
    try {
    
    T convertedBean = getTypeConverter().convertIfNecessary(bean, requiredType);
    
    if (convertedBean == null) {
    
    throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
    
    }
    
    return convertedBean;
    
    }
    
    catch (TypeMismatchException ex) {
    
    throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
    
    }
    
    }
    
    return (T) bean;
    
    }

进入getSingleton()方法后,发现里面都是做一些准备工作,真正的调用是lambda表达式org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)

    
    public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
    
    synchronized (this.singletonObjects) {
    
    Object singletonObject = this.singletonObjects.get(beanName);
    
    if (singletonObject == null) {
    
    if (this.singletonsCurrentlyInDestruction) {
    
    throw new BeanCreationNotAllowedException(beanName,
    
    "Singleton bean creation not allowed while singletons of this factory are in destruction " +
    
    "(Do not request a bean from a BeanFactory in a destroy method implementation!)");
    
    }
    
    
    
    beforeSingletonCreation(beanName);
    
    boolean newSingleton = false;
    
    boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
    
    if (recordSuppressedExceptions) {
    
    this.suppressedExceptions = new LinkedHashSet<>();
    
    }
    
    try {
    
    singletonObject = singletonFactory.getObject();
    
    newSingleton = true;
    
    }
    
    catch (IllegalStateException ex) {
    
    singletonObject = this.singletonObjects.get(beanName);
    
    if (singletonObject == null) {
    
    throw ex;
    
    }
    
    }
    
    catch (BeanCreationException ex) {
    
    if (recordSuppressedExceptions) {
    
    for (Exception suppressedException : this.suppressedExceptions) {
    
    ex.addRelatedCause(suppressedException);
    
    }
    
    }
    
    throw ex;
    
    }
    
    finally {
    
    if (recordSuppressedExceptions) {
    
    this.suppressedExceptions = null;
    
    }
    
    afterSingletonCreation(beanName);
    
    }
    
    if (newSingleton) {
    
    addSingleton(beanName, singletonObject);
    
    }
    
    }
    
    return singletonObject;
    
    }
    
    }

第一二处

进入lambda表达式中org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])

    
    protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    
    throws BeanCreationException {
    
    RootBeanDefinition mbdToUse = mbd;
    
    .
    
    Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
    
    if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
    
    mbdToUse = new RootBeanDefinition(mbd);
    
    mbdToUse.setBeanClass(resolvedClass);
    
    }
    // Prepare method overrides.
    
    try {
    
    mbdToUse.prepareMethodOverrides();
    
    }
    
    catch (BeanDefinitionValidationException ex) {
    
    throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
    
    beanName, "Validation of method overrides failed", ex);
    
    }
    try {
    
    // 实例化的前置处理,AOP功能就是基于这里判断的
    
    Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
    
    if (bean != null) {
    
    return bean;
    
    }
    
    }
    
    catch (Throwable ex) {
    
    throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
    
    "BeanPostProcessor before instantiation of bean failed", ex);
    
    }
    
    try {
    
    Object beanInstance = doCreateBean(beanName, mbdToUse, args);
    
    return beanInstance;
    
    }
    
    catch (BeanCreationException | ImplicitlyAppearedSingletonException ex) {
    
    throw ex;
    
    }
    
    catch (Throwable ex) {
    
    throw new BeanCreationException(
    
    mbdToUse.getResourceDescription(), beanName, "Unexpected exception during bean creation", ex);
    
    }
    
    }
    
    @Nullable
    
    protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    
    Object bean = null;
    
    if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
    
    // Make sure bean class is actually resolved at this point.
    
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    
    Class<?> targetType = determineTargetType(beanName, mbd);
    
    if (targetType != null) {
    
    // 第一处
    
    bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
    
    if (bean != null) {
    
    // 第二处
    
    bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
    
    }
    
    }
    
    }
    
    mbd.beforeInstantiationResolved = (bean != null);
    
    }
    
    return bean;
    
    }

第三处

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance

    
    protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
    
    
    
    // Candidate constructors for autowiring?
    
    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
    
    ···
    
    }
    
    
    
    protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName)
    
    throws BeansException {
    
    
    
    if (beanClass != null && hasInstantiationAwareBeanPostProcessors()) {
    
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
    
    if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
    
    SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
    
    Constructor<?>[] ctors = ibp.determineCandidateConstructors(beanClass, beanName);
    
    if (ctors != null) {
    
    return ctors;
    
    }
    
    }
    
    }
    
    }
    
    return null;
    
    }

第四五、十一处

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean

    
    protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    
    throws BeanCreationException {
    
    ···
    
    synchronized (mbd.postProcessingLock) {
    
    if (!mbd.postProcessed) {
    
    try {
    
    // 第4处
    
    applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
    
    }
    
    catch (Throwable ex) {
    
    throw new BeanCreationException(mbd.getResourceDescription(), beanName,
    
    "Post-processing of merged bean definition failed", ex);
    
    }
    
    mbd.postProcessed = true;
    
    }
    
    }
    
    boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
    
    isSingletonCurrentlyInCreation(beanName));
    
    if (earlySingletonExposure) {
    
    if (logger.isTraceEnabled()) {
    
    logger.trace("Eagerly caching bean '" + beanName +
    
    "' to allow for resolving potential circular references");
    
    }
    
    // 第五处 lambda表达式
    
    addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    
    }
    
    ···
    
    try {
    
    // 第11处 Register bean as disposable.
    
    registerDisposableBeanIfNecessary(beanName, bean, mbd);
    
    }
    
    return exposedObject;
    
    }
    
    
    // 第五处 lambda表达式
    
    protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    
    Object exposedObject = bean;
    
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
    
    if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
    
    SmartInstantiationAwareBeanPostProcessor ibp = (SmartInstantiationAwareBeanPostProcessor) bp;
    
    exposedObject = ibp.getEarlyBeanReference(exposedObject, beanName);
    
    }
    
    }
    
    }
    
    return exposedObject;
    
    }

第六七八处

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean

    
    protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
    
    ···
    
    if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
    
    if (bp instanceof InstantiationAwareBeanPostProcessor) {
    
    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    
    // 第六处
    
    if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    
    return;
    
    }
    
    }
    
    }
    
    }
    
    PropertyDescriptor[] filteredPds = null;
    
    if (hasInstAwareBpps) {
    
    if (pvs == null) {
    
    pvs = mbd.getPropertyValues();
    
    }
    
    for (BeanPostProcessor bp : getBeanPostProcessors()) {
    
    if (bp instanceof InstantiationAwareBeanPostProcessor) {
    
    InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
    
    // 第7处
    
    PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
    
    if (pvsToUse == null) {
    
    if (filteredPds == null) {
    
    filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    
    }
    
    // 第8处
    
    pvsToUse = ibp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
    
    if (pvsToUse == null) {
    
    return;
    
    }
    
    }
    
    pvs = pvsToUse;
    
    }
    
    }
    
    }

第九十处

org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)

    
    protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    
    if (System.getSecurityManager() != null) {
    
    AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
    
    invokeAwareMethods(beanName, bean);
    
    return null;
    
    }, getAccessControlContext());
    
    }
    
    else {
    
    // 处理实现了aware的接口,设置beanname或者工厂
    
    invokeAwareMethods(beanName, bean);
    
    }
    
    
    
    Object wrappedBean = bean;
    
    if (mbd == null || !mbd.isSynthetic()) {
    
    //第九处
    
    wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    
    }
    
    
    
    try {
    
    invokeInitMethods(beanName, wrappedBean, mbd);
    
    }
    
    catch (Throwable ex) {
    
    throw new BeanCreationException(
    
    (mbd != null ? mbd.getResourceDescription() : null),
    
    beanName, "Invocation of init method failed", ex);
    
    }
    
    if (mbd == null || !mbd.isSynthetic()) {
    
    // 第10处
    
    wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    
    }
    
    
    
    return wrappedBean;
    
    }
    
    
    
    // Spring初始化扩展方法
    
    protected void invokeInitMethods(String beanName, Object bean, @Nullable RootBeanDefinition mbd)
    
    throws Throwable {
    
    
    
    boolean isInitializingBean = (bean instanceof InitializingBean);
    
    if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
    
    if (logger.isTraceEnabled()) {
    
    logger.trace("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
    
    }
    
    if (System.getSecurityManager() != null) {
    
    try {
    
    AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
    
    ((InitializingBean) bean).afterPropertiesSet();
    
    return null;
    
    }, getAccessControlContext());
    
    }
    
    catch (PrivilegedActionException pae) {
    
    throw pae.getException();
    
    }
    
    }
    
    else {
    
    ((InitializingBean) bean).afterPropertiesSet();
    
    }
    
    }
    
    \
    
    
    if (mbd != null && bean.getClass() != NullBean.class) {
    
    String initMethodName = mbd.getInitMethodName();
    
    if (StringUtils.hasLength(initMethodName) &&
    
    !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
    
    !mbd.isExternallyManagedInitMethod(initMethodName)) {
    
    invokeCustomInitMethod(beanName, bean, mbd);
    
    }
    
    }
    
    }