zoukankan      html  css  js  c++  java
  • Spring中bean的实例化过程

    1.从缓存中。优先从一级缓存中拿,有则返回。 如果没有,则从二级缓存中获取,有则返回。 如果二级缓存中拿不到,则从三级缓存中拿,能拿到,则从三级缓存中删除,移到二级缓存。

    如果三级缓存也没有,则返回null.

    2. 如果是单例模式, 则走createBean 的流程,进行bean对象的实例化。

      2.1 获取到该beanDefinition对应的字节码对象。

     2.2 prepareMethodOverrides。 检查beanDefinition对象的每一个methodOverride的对象。如果该对象对应的同名的方法只有一个则设置为false, 默认设置为true.

     2.3 调用doCreateBean 方法,进行具体的实例化过程。

    3. 

     3.1 如果是单例的,则从bean工厂的实例缓存中获取bean对象。

    if (mbd.isSingleton()) {
    instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    }
    3.2 如果获取到的为空, 则进行bean对象的实例化创建。调用createBeanInstance
    if (instanceWrapper == null) {
    //创建实例,,重点看,重要程度:5
    instanceWrapper = createBeanInstance(beanName, mbd, args);
    }

    3.3如果有FactoryMethodName属性,则通过factorymethod 方法进行对象的实例化。
    if (mbd.getFactoryMethodName() != null) {
    return instantiateUsingFactoryMethod(beanName, mbd, args);
    }

    3.4 否则,
    寻找当前正在实例化的bean中有@Autowired注解的构造函数
    // 调用SmartInstantiationAwareBeanPostProcessor类型的beanpostProcess.determineCandidateConstructors 获取有autowired和value注解的构造器。
    Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);

    3.5
    //如果ctors不为空,就说明构造函数上有@Autowired注解, 则通过构造函数进行初始化。
    if (ctors != null || mbd.getResolvedAutowireMode() == AUTOWIRE_CONSTRUCTOR ||
    mbd.hasConstructorArgumentValues() || !ObjectUtils.isEmpty(args)) {
    //如果ctors不为空,就说明构造函数上有@Autowired注解
    return autowireConstructor(beanName, mbd, ctors, args);
    }

    3.6 如果首选的构造器不为空, 则使用首选的构造器进行实例化,以及进行以来注入
    // Preferred constructors for default construction?
    ctors = mbd.getPreferredConstructors();
    if (ctors != null) {
    return autowireConstructor(beanName, mbd, ctors, null);
    }

    3.7 否则调用无参构造函数进行bean的实例化。
    //无参构造函数的实例化,大部分的实例是采用的无参构造函数的方式实例化,并包装成一个BeanWrapper 对象进行返回。
    return instantiateBean(beanName, mbd);

    4. 调用applyMergedBeanDefinitionPostProcessors。主要是对实现了MergedBeanDefinitionPostProcessor接口的postProcessMergedBeanDefinition方法调用。
    主要的实现类有:

    4.1 AutowiredAnnotationBeanPostProcessor。在postProcessMergedBeanDefinition方法中实现对Autowired,Value注解的注解信息收集,封装到externallyManagedConfigMembers。
        4.2  CommonAnnotationBeanPostProcessor。 在postProcessMergedBeanDefinition方法中实现对@PostConstrutor 和 @ PreDestory ,@Resource 注解的信息收集,封装到externallyManagedConfigMembers。
    5. 检查是否允许循环依赖,以及是否是单例模式。满足条件的话,从二级缓存中移除,并且添加到三级缓存中。
    6.进行属性的注入,调用populateBean 方法。
    6.1 根据注入的模式,进行对应属性的字段,filed ,以及method依赖的解析。获取其依赖的对象的值。
    6.2 调用实现了InstantiationAwareBeanPostProcessor接口的postProcessProperties 方法,对有autowired,value,resource 注解的属性实现属性值的注入。
    AutowiredAnnotationBeanPostProcessor中实现对autowired,value 属性的注入。
    在CommonAnnotationBeanPostProcessor中实现对resource 属性的注入。
    6.3 调用applyPropertyValues 方法,实现对<property/> 标签的属性值的解析。

    7.调用bean的
    initializeBean方法,完成bean 实例化过程的后续操作。

    7.1 调用invokeAwareMethods 方法。根据是否实现了 一系列的aware 接口,调用其对应的方法
    7.2 调用BeanPostProcessor接口的postProcessBeforeInitialization方法。进行bean初始化的前期方法调用。对 initmethod,,afterpeoperties, postcontructor 方法调用。

      1.InitDestroyAnnotationBeanPostProcessor中实现对@PostContrustor注解标识的方法进行调用

                    2.调用实现了InitializingBean 接口的afterpropertiesSet 方法。
                    3.调用指定了init-method属性的方法。

         7.3  调用applyBeanPostProcessorsAfterInitialization方法,实现对BeanPostProcessor的postProcessAfterInitialization的方法的调用(TODO 这一个涉及到AOP的实现。后续完善。)

      

    8.调用 registerDisposableBeanIfNecessary 方法。实现spring容器销毁时,bean 对象销毁是的操作注册。










     
     
  • 相关阅读:
    VS2008编写MFC程序--使用opencv2.4()
    November 02nd, 2017 Week 44th Thursday
    November 01st, 2017 Week 44th Wednesday
    October 31st, 2017 Week 44th Tuesday
    October 30th, 2017 Week 44th Monday
    October 29th, 2017 Week 44th Sunday
    October 28th, 2017 Week 43rd Saturday
    October 27th, 2017 Week 43rd Friday
    October 26th, 2017 Week 43rd Thursday
    October 25th, 2017 Week 43rd Wednesday
  • 原文地址:https://www.cnblogs.com/cheng21553516/p/12199431.html
Copyright © 2011-2022 走看看