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 对象销毁是的操作注册。










     
     
  • 相关阅读:
    java中CyclicBarrier的使用
    java并发中CountDownLatch的使用
    java中Locks的使用
    java 中的fork join框架
    java中ThreadPool的介绍和使用
    java中的daemon thread
    java中interrupt,interrupted和isInterrupted的区别
    java中的Atomic类
    怎么在java中关闭一个thread
    java中join的使用
  • 原文地址:https://www.cnblogs.com/cheng21553516/p/12199431.html
Copyright © 2011-2022 走看看