深入理解SpringIOC(二) ---- Bean的生命周期

引言:

spring bean 的生命周期基本上是面试必问的一道面试题,下面我们来总结一下。。。。

Bean的生命周期(官方解释)

Bean factory implementations should support the standard bean lifecycle interfaces as far as possible. The full set of initialization methods and their standard order is:

  1. BeanNameAware’s setBeanName
  2. BeanClassLoaderAware’s setBeanClassLoader
  3. BeanFactoryAware’s setBeanFactory
  4. EnvironmentAware’s setEnvironment
  5. EmbeddedValueResolverAware’s setEmbeddedValueResolver
  6. ResourceLoaderAware’s setResourceLoader (only applicable when running in an application context)
  7. ApplicationEventPublisherAware’s setApplicationEventPublisher (only applicable when running in an application context)
  8. MessageSourceAware’s setMessageSource (only applicable when running in an application context)
  9. ApplicationContextAware’s setApplicationContext (only applicable when running in an application context)
  10. ServletContextAware’s setServletContext (only applicable when running in a web application context)
  11. postProcessBeforeInitialization methods of BeanPostProcessors
  12. InitializingBean’s afterPropertiesSet
  13. a custom init-method definition
  14. postProcessAfterInitialization methods of BeanPostProcessors

On shutdown of a bean factory, the following lifecycle methods apply:

  1. postProcessBeforeDestruction methods of DestructionAwareBeanPostProcessors
  2. DisposableBean’s destroy
  3. a custom destroy-method definition

Bean的生命周期图解

在这里插入图片描述

Pojo对象

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
public class MyLifeCycleBean implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean, DisposableBean {

	 // 姓名
	 private String name;
	 
	 // 年龄
	 private int age;
	 
	 @Override
	 public void setBeanName(String name) {
	  System.out.println("01-->BeanNameAware接口被调用了, 获取到的beanName:" + name);
	 }
	 
	 @Override
	 public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
	  System.out.println("02-->BeanFactoryAware接口被调用了");
	 }
	 
	 @Override
	 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
	  System.out.println("03-->ApplicationContextAware接口被调用了");
	 }
	 
	 @Override
	 public void afterPropertiesSet() throws Exception {
	  System.out.println("05-->InitializingBean接口被调用了");
	 }
	 
	 public void myInit() {
	  System.out.println("06-->myInit方法被调用了");
	 }
	 
	 @Override
	 public void destroy() throws Exception {
	  System.out.println("09-->DisposableBean接口被调用了");
	 }
	 
	 public void myDestroy() {
	  System.out.println("10-->自定义destroy-method方法被调动了");
	 }
	 
	 public String getName() {
	  return name;
	 }
	 
	 public void setName(String name) {
	  this.name = name;
	 }
	 
	 public int getAge() {
	  return age;
	 }
	 
	 public void setAge(int age) {
	  this.age = age;
	 }
	 
	 @Override
	 public String toString() {
	  return "MyLifeCycleBean{" + "name='" + name + '\'' + ", age=" + age + '}';
	 }
	}
	

后置处理器(BeanPostProcessor)

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {

	 @Override
	 public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
	  System.out.println("04-->调用postProcessBeforeInitialization方法, 获取到的beanName: " + beanName);
	  ((MyLifeCycleBean) bean).setName("李四");
	  return bean;
	 }
	 
	 @Override
	 public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
	  System.out.println("07-->调用postProcessAfterInitialization, 获取到的beanName: " + beanName);
	  ((MyLifeCycleBean) bean).setAge(30);
	  return bean;
	 }
	 
}	

applicationContext.xml(配置类)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
        
 <!--注意:这里配置的name是张三,age是25,我们会通过beanPostProcessor来修改nage和age -->
 <bean id="myLifeCycleBean" name="myLifeCycleBean1,myLifeCycleBean2" class="com.lyc.cn.day02.MyLifeCycleBean"
  destroy-method="myDestroy"   init-method="myInit">
  <property name="name" value="张三"/>
  <property name="age" value="25"/>
 </bean>
 <bean id="myBeanPostProcessor" class="com.yyc.MyBeanPostProcessor"/>
</beans>

测试

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MyLifeCycleBeanTest {

 @Before
 public void before() {
  System.out.println("---bean生命周期开始---\n");
 }
 
 @After
 public void after() {
  System.out.println("\n---bean生命周期结束---");
 }
 /**
  * 生命周期测试
  */
 @Test
 public void testDefaultConstructor() {
  ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
  MyLifeCycleBean myLifeCycleBean = applicationContext.getBean("myLifeCycleBean", MyLifeCycleBean.class);
  System.out.println("08-->bean可以被使用了, beanInfo: " + myLifeCycleBean.toString());
  ((ClassPathXmlApplicationContext) applicationContext).destroy();
 }
}

执行结果

—bean生命周期开始—
01–>BeanNameAware接口被调用了, 获取到的beanName:myLifeCycleBean
02–>BeanFactoryAware接口被调用了
03–>ApplicationContextAware接口被调用了
04–>调用postProcessBeforeInitialization方法, 获取到的beanName: myLifeCycleBean
05–>InitializingBean接口被调用了
06–>myInit方法被调用了
07–>调用postProcessAfterInitialization, 获取到的beanName: myLifeCycleBean
08–>bean可以被使用了, beanInfo: MyLifeCycleBean{name=‘李四’, age=30}
09–>DisposableBean接口被调用了
10–>自定义destroy-method方法被调动了
—bean生命周期结束—

(普通且非懒加载)Bean的初始化流程

在初始化容器时
调用refresh()
----》1. registerBeanPostProcessors() //注册beanDefinition到BeanDefinitionMap中
----》2. finishBeanFactoryInitialization()//实例化Bean并添加到单例缓冲池中

补充:

1.什么是beanDefinition?

描述Bean的一系列信息。
在这里插入图片描述

代码详解

1. registerBeanPostProcessors内部的具体流程

在这里插入图片描述

2. finishBeanFactoryInitialization内部的具体流程

流程图
在这里插入图片描述

//第一步

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(new StringValueResolver() {
            public String resolveStringValue(String strVal) {
                return AbstractApplicationContext.this.getEnvironment().resolvePlaceholders(strVal);
            }
        });
    }

    //处理关于Aspectj
    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];
        this.getBean(weaverAwareName);
    }

    //Stopping using the temporary ClassLoader for type matching
    beanFactory.setTempClassLoader((ClassLoader)null);

    //冻结所有的bean定义,说明注册的bean 定义将不被修改或进一步的处理
    beanFactory.freezeConfiguration();

    //实例化剩余的bean  ---》bean的实例化过程(重点)
---》    beanFactory.preInstantiateSingletons();
}

//第二步

public void preInstantiateSingletons() throws BeansException {
    if (this.logger.isDebugEnabled()) {
        this.logger.debug("Pre-instantiating singletons in " + this);
    }


    //获取我们容器中所有bean定义的名称
    List<String> beanNames = new ArrayList(this.beanDefinitionNames);


    //循环所有的bean定义名称
    Iterator var2 = beanNames.iterator();

    while(true) {
        while(true) {
            String beanName;

            //合并我们所有的bean定义
            RootBeanDefinition bd;


            //判断bean定义不是抽象的&&不是懒加载的&&不是单例的
            do {
                do {
                    do {
                        if (!var2.hasNext()) {
                            var2 = beanNames.iterator();

                            while(var2.hasNext()) {
                                beanName = (String)var2.next();
                                Object singletonInstance = this.getSingleton(beanName);
                                if (singletonInstance instanceof SmartInitializingSingleton) {
                                    final SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton)singletonInstance;
                                    if (System.getSecurityManager() != null) {
                                        AccessController.doPrivileged(new PrivilegedAction<Object>() {
                                            public Object run() {
                                                smartSingleton.afterSingletonsInstantiated();
                                                return null;
                                            }
                                        }, this.getAccessControlContext());
                                    } else {
                                        smartSingleton.afterSingletonsInstantiated();
                                    }
                                }
                            }

                            return;
                        }

                        beanName = (String)var2.next();
                        bd = this.getMergedLocalBeanDefinition(beanName);
                    } while(bd.isAbstract());
                } while(!bd.isSingleton());
            } while(bd.isLazyInit());


            //判断是不是工厂bean
            if (this.isFactoryBean(beanName)) {
                //如果是工厂Bean,就给前面加&符号
                final FactoryBean<?> factory = (FactoryBean)this.getBean("&" + beanName);
                boolean isEagerInit;
                if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
                    isEagerInit = ((Boolean) AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
                        public Boolean run() {
                            return ((SmartFactoryBean)factory).isEagerInit();
                        }
                    }, this.getAccessControlContext())).booleanValue();
                } else {
                    isEagerInit = factory instanceof SmartFactoryBean && ((SmartFactoryBean)factory).isEagerInit();
                }

                if (isEagerInit) {
                    this.getBean(beanName);
                }
            } else {

                //非工厂Bean ---》Bean的实例化流程(重点)
---》                this.getBean(beanName);
            }
        }
    }
}

//第三步

/**
 * @param name  bean的名称,也可能是别名
 * @return  我们需要的单例对象
 * @throws BeansException
 */
public Object getBean(String name) throws BeansException {

    //Bean的实例化流程(重点)
---》    return this.doGetBean(name, (Class)null, (Object[])null, false);
}

//第四步

protected <T> T doGetBean(String name, Class<T> requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {

    //解析别名
    final String beanName = this.transformedBeanName(name);

    //尝试从单例缓冲池中获取
    Object sharedInstance = this.getSingleton(beanName);
    Object bean;
    if (sharedInstance != null && args == null) {
        if (this.logger.isDebugEnabled()) {
            if (this.isSingletonCurrentlyInCreation(beanName)) {
                this.logger.debug("Returning eagerly cached instance of singleton bean '" + beanName + "' that is not fully initialized yet - a consequence of a circular reference");
            } else {
                this.logger.debug("Returning cached instance of singleton bean '" + beanName + "'");
            }
        }

        bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, (RootBeanDefinition)null);
    } else {
        if (this.isPrototypeCurrentlyInCreation(beanName)) {
            throw new BeanCurrentlyInCreationException(beanName);
        }


        //判断是否有父工厂
        //当Controller中注入Service的时候,发现是引用对象,就会调用getBean()方法,但是当前是在子容器SpringMVC
        //那么就先从父容器Spring中找
        BeanFactory parentBeanFactory = this.getParentBeanFactory();

        //如果父容器存在且当前容器没有,就从父工厂去拿
        if (parentBeanFactory != null && !this.containsBeanDefinition(beanName)) {
            String nameToLookup = this.originalBeanName(name);
            if (args != null) {
                return parentBeanFactory.getBean(nameToLookup, args);
            }

            return parentBeanFactory.getBean(nameToLookup, requiredType);
        }

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

        try {
            final RootBeanDefinition mbd = this.getMergedLocalBeanDefinition(beanName);
            this.checkMergedBeanDefinition(mbd, beanName, args);
            //获取对象依赖
            String[] dependsOn = mbd.getDependsOn();
            String[] var11;
            //spring处理对象依赖的关键代码 ( 在注解有@Bean的对象上注解DependOn,Spring无法解决对象循环依赖)
            if (dependsOn != null) {
                var11 = dependsOn;
                int var12 = dependsOn.length;

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

                    this.registerDependentBean(dep, beanName);
                    this.getBean(dep);
                }
            }

            //创建单例bean
            if (mbd.isSingleton()) {


                //Bean的实例化流程(重点)---》

                //把beanName和一个singletonFactory,并且传入一个回调对象用于回调createBean()方法
---》                sharedInstance = this.getSingleton(beanName, new ObjectFactory<Object>() {
                    public Object getObject() throws BeansException {
                        try {
                            //真正创建bean的逻辑
                            return AbstractBeanFactory.this.createBean(beanName, mbd, args);
                        } catch (BeansException var2) {
                            AbstractBeanFactory.this.destroySingleton(beanName);
                            throw var2;
                        }
                    }
                });
                bean = this.getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
            } else if (mbd.isPrototype()) {
                var11 = null;

                Object prototypeInstance;
                try {
                    this.beforePrototypeCreation(beanName);
                    prototypeInstance = this.createBean(beanName, mbd, args);
                } finally {
                    this.afterPrototypeCreation(beanName);
                }

                bean = this.getObjectForBeanInstance(prototypeInstance, name, beanName, mbd);
            } else {
                String scopeName = mbd.getScope();
                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, new ObjectFactory<Object>() {
                        public Object getObject() throws BeansException {
                            AbstractBeanFactory.this.beforePrototypeCreation(beanName);

                            Object var1;
                            try {
                                var1 = AbstractBeanFactory.this.createBean(beanName, mbd, args);
                            } finally {
                                AbstractBeanFactory.this.afterPrototypeCreation(beanName);
                            }

                            return var1;
                        }
                    });
                    bean = this.getObjectForBeanInstance(scopedInstance, name, beanName, mbd);
                } catch (IllegalStateException var21) {
                    throw new BeanCreationException(beanName, "Scope '" + scopeName + "' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton", var21);
                }
            }
        } catch (BeansException var23) {
            this.cleanupAfterBeanCreationFailure(beanName);
            throw var23;
        }
    }

    if (requiredType != null && bean != null && !requiredType.isAssignableFrom(bean.getClass())) {
        try {
            return this.getTypeConverter().convertIfNecessary(bean, requiredType);
        } catch (TypeMismatchException var22) {
            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Failed to convert bean '" + name + "' to required type '" + ClassUtils.getQualifiedName(requiredType) + "'", var22);
            }

            throw new BeanNotOfRequiredTypeException(name, requiredType, bean.getClass());
        }
    } else {
        return bean;
    }
}

//第五步

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
    Assert.notNull(beanName, "'beanName' must not be null");
    Map var3 = this.singletonObjects;
    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!)");
            }

            if (this.logger.isDebugEnabled()) {
                this.logger.debug("Creating shared instance of singleton bean '" + beanName + "'");
            }

            //标识这个bean马上要创建了
            this.beforeSingletonCreation(beanName);
            boolean newSingleton = false;
            boolean recordSuppressedExceptions = this.suppressedExceptions == null;
            if (recordSuppressedExceptions) {
                this.suppressedExceptions = new LinkedHashSet();
            }

            try {

                //初始化bean

                //这个过程实际上是在调用CreateBean()  --->真正创建bean的逻辑
---》                singletonObject = singletonFactory.getObject();

                newSingleton = true;
            } catch (IllegalStateException var16) {
                singletonObject = this.singletonObjects.get(beanName);
                if (singletonObject == null) {
                    throw var16;
                }
            } catch (BeanCreationException var17) {
                BeanCreationException ex = var17;
                if (recordSuppressedExceptions) {
                    Iterator var8 = this.suppressedExceptions.iterator();

                    while(var8.hasNext()) {
                        Exception suppressedException = (Exception)var8.next();
                        ex.addRelatedCause(suppressedException);
                    }
                }

                throw ex;
            } finally {
                if (recordSuppressedExceptions) {
                    this.suppressedExceptions = null;
                }

                this.afterSingletonCreation(beanName);
            }

            if (newSingleton) {

                //将创建好的实例加入到单例缓冲池中
                this.addSingleton(beanName, singletonObject);
            }
        }

        return singletonObject != NULL_OBJECT ? singletonObject : null;
    }
}

//第六步

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

    RootBeanDefinition mbdToUse = mbd;

    //确保此时的bean已经被解析了
    //如果获取的class属性不为null,则克隆该BeanDefinition
    //主要因为该动态解析的class无法到共享的BeanDefinition
    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 {
        //验证和准备覆盖方法
        mbdToUse.prepareMethodOverrides();
    } catch (BeanDefinitionValidationException var7) {
        throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(), beanName, "Validation of method overrides failed", var7);
    }

    Object beanInstance;
    try {

        //解析aop切面的信息并进行缓存  --》aop和事务实现的关键之第一处
        beanInstance = this.resolveBeforeInstantiation(beanName, mbdToUse);
        if (beanInstance != null) {
            return beanInstance;
        }
    } catch (Throwable var8) {
        throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName, "BeanPostProcessor before instantiation of bean failed", var8);
    }

    //真正创建bean的逻辑  ---》doCreateBean
---》    beanInstance = this.doCreateBean(beanName, mbdToUse, args);
    if (this.logger.isDebugEnabled()) {
        this.logger.debug("Finished creating instance of bean '" + beanName + "'");
    }

    return beanInstance;
}

//第七步

protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, Object[] args) throws BeanCreationException {

    //BeanWrapper是对Bean的包装,其接口所定义的功能很简单包括设置获取被包装的对象,获取被包装bean的属性描述器
    BeanWrapper instanceWrapper = null;
    if (mbd.isSingleton()) {

        //从没有完成的FactoryBean中移除
        instanceWrapper = (BeanWrapper)this.factoryBeanInstanceCache.remove(beanName);
    }

    if (instanceWrapper == null) {

        //使用合适的方式策略来创建新的实例(工厂方法,构造函数自动注入方法)---》到这创建了Bean但是只是原生对象
---》        instanceWrapper = this.createBeanInstance(beanName, mbd, args); 
          //注:这个我就不进去了。
    }


    //从BeanWrapper获取我们的早期对象
    final Object bean = instanceWrapper != null ? instanceWrapper.getWrappedInstance() : null;

    Class<?> beanType = instanceWrapper != null ? instanceWrapper.getWrappedClass() : null;
    mbd.resolvedTargetType = beanType;
    Object var7 = mbd.postProcessingLock;
    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;
        }
    }

   // earlySingletonExposure 用于表示是否”提前暴露“原始对象的引用(如果这个bean是单例的并且允许循环依赖并且是已经被注册马上要实例化)
  boolean earlySingletonExposure = mbd.isSingleton() && this.allowCircularReferences && this.isSingletonCurrentlyInCreation(beanName);
    if (earlySingletonExposure) {
        if (this.logger.isDebugEnabled()) {
            this.logger.debug("Eagerly caching bean '" + beanName + "' to allow for resolving potential circular references");
        }
        //提前暴露早期对象,加入到三级缓存中
        this.addSingletonFactory(beanName, new ObjectFactory<Object>() {
            public Object getObject() throws BeansException {
                /*获取原始对象的早期引用,在 getEarlyBeanReference 方法中,会执行 AOP 
                 * 相关逻辑。若 bean 未被 AOP 拦截,getEarlyBeanReference 原样返回 bean,相当于return bean();
                 * /
              return AbstractAutowireCapableBeanFactory.this.getEarlyBeanReference(beanName, mbd, bean);
            }
        });
    }

    Object exposedObject = bean;
    try {
        //在这里进行依赖注入---》给属性进行赋值(注有 Autowired 等)
        this.populateBean(beanName, mbd, instanceWrapper);
        if (exposedObject != null) {
     
                //执行对象初始化操作(在这里可能生成代理对象)
---》            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 'getBeanNamesOfType' 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);
    }
}

//第八步

protected Object initializeBean(final String beanName, final Object bean, RootBeanDefinition mbd) {
    if (System.getSecurityManager() != null) {
        AccessController.doPrivileged(new PrivilegedAction<Object>() {
            public Object run() {
                AbstractAutowireCapableBeanFactory.this.invokeAwareMethods(beanName, bean);
                return null;
            }
        }, this.getAccessControlContext());
    } else {
        // 若 bean 实现了 BeanNameAware、BeanFactoryAware、BeanClassLoaderAware 等接口,则向 bean 中注入相关对象
---》        this.invokeAwareMethods(beanName, bean);
    }

    Object wrappedBean = bean;
    if (mbd == null || !mbd.isSynthetic()) {
        //调用我们bean的前置处理器    注:在此处执行我们的@PostCust注解方法
 ---》        wrappedBean = this.applyBeanPostProcessorsBeforeInitialization(bean, beanName);
    }

    try {
       /*
         * 调用初始化方法:
         * 1. 若 bean 实现了 InitializingBean 接口,则调用 afterPropertiesSet 方法
         * 2. 若用户配置了 bean 的 init-method 属性,则调用用户在配置中指定的方法
 */
---》        this.invokeInitMethods(beanName, wrappedBean, mbd);
    } catch (Throwable var6) {
        throw new BeanCreationException(mbd != null ? mbd.getResourceDescription() : null, beanName, "Invocation of init method failed", var6);
    }

    if (mbd == null || !mbd.isSynthetic()) {

        //调用我们的bean的后置处理器  注:aop实现的关键
---》        wrappedBean = this.applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
         注:这个aop的时候分析
    }

    return wrappedBean;
}
//invokeAwareMethods 方法的逻辑很简单,一句话总结:根据 bean 所实现的 Aware 的类型,向 bean 中注入不同类型的对象。
private void invokeAwareMethods(final String beanName, final Object bean) {
    if (bean instanceof Aware) {
        if (bean instanceof BeanNameAware) {
            // 注入 beanName 字符串
            ((BeanNameAware) bean).setBeanName(beanName);
        }
        if (bean instanceof BeanClassLoaderAware) {
            // 注入 ClassLoader 对象
            ((BeanClassLoaderAware) bean).setBeanClassLoader(getBeanClassLoader());
        }
        if (bean instanceof BeanFactoryAware) {
            // 注入 BeanFactory 对象
            ((BeanFactoryAware) bean).setBeanFactory(AbstractAutowireCapableBeanFactory.this);
        }
    }
}

//调用我们bean的前置处理器 ,执行我们的自定义前置方法
注:在此处执行我们的@PostCust注解方法
public Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException {
    Object result = existingBean;
    Iterator var4 = this.getBeanPostProcessors().iterator();

    do {
        if (!var4.hasNext()) {
            return result;
        }

        BeanPostProcessor beanProcessor = (BeanPostProcessor)var4.next();
        result = beanProcessor.postProcessBeforeInitialization(result, beanName);
    } while(result != null);

    return result;
}


//invokeInitMethods 方法用于执行初始化方法
protected void invokeInitMethods(String beanName, final Object bean, RootBeanDefinition mbd)
        throws Throwable {

    // 检测 bean 是否是 InitializingBean 类型的
    boolean isInitializingBean = (bean instanceof InitializingBean);
    if (isInitializingBean && (mbd == null || !mbd.isExternallyManagedInitMethod("afterPropertiesSet"))) {
        if (logger.isDebugEnabled()) {
            logger.debug("Invoking afterPropertiesSet() on bean with name '" + beanName + "'");
        }
        if (System.getSecurityManager() != null) {
            try {
                AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
                    @Override
                    public Object run() throws Exception {
                        ((InitializingBean) bean).afterPropertiesSet();
                        return null;
                    }
                }, getAccessControlContext());
            }
            catch (PrivilegedActionException pae) {
                throw pae.getException();
            }
        }
        else {
            // 如果 bean 实现了 InitializingBean,则调用 afterPropertiesSet 方法执行初始化逻辑
            ((InitializingBean) bean).afterPropertiesSet();
        }
    }
    if (mbd != null) {
        String initMethodName = mbd.getInitMethodName();
        if (initMethodName != null && !(isInitializingBean && "afterPropertiesSet".equals(initMethodName)) &&
                !mbd.isExternallyManagedInitMethod(initMethodName)) {
            // 调用用户自定义的初始化方法
            invokeCustomInitMethod(beanName, bean, mbd);
        }
    }
}

这就是一次Spring Bean的初始化流程

发布了45 篇原创文章 · 获赞 3 · 访问量 2309

猜你喜欢

转载自blog.csdn.net/weixin_44046437/article/details/100045158