zoukankan      html  css  js  c++  java
  • 聊聊spring之bean对象的实例化过程

    在spring实例化 之前bean对象封装成 beanDefinition 对象 想了解详情的请参考上一篇文章

    好了 我们聊聊 Bean 的实例化过程的几个重要角色
    BeanDefinitionRegistryPostProcessor 接口
    Refresh().invokeBeanFactoryPostProcessors 这个方法里面。
    BeanDefinitionRegistryPostProcessor 这个接口的调用分为三部:
    1、调用实现了 PriorityOrdered 排序接口
    2、调用实现了 Ordered 排序接口
    3、没有实现接口的调用
    这个接口我的理解:获取 BeanDefinitionRegistry 对象,获取到这个对象就可以获取这个对象中注册的
    所有 BeanDefinition 对象,所以我们知道了,我们拥有这个对象就可以完成里面所有 BeanDefinition 对
    象的修改新增操作
    BeanPostProcessor 的注册
    Refresh().registerBeanPostProcessors 这个方法里面。
    拿到 BeanFactory 中所有注册的 BeanDefinition 对象的名称 beanName。
     
    然后判断是否实现了 PriorityOrdered 排序接口,Ordered 排序接口,getBean 是将
    该 ppName 对应的 BeanDefinition 对象实例化。
    把对应的 BeanPostProcessor 对象注册到 BeanFactory 中,BeanFactory 中有一个
    list 容器接收。
    getSingleton 方法
    代码位置:
    AbstractBeanFactory.doGetBean 方法中
     
    方法里面核心要点:

     

    把 beanName 添加到 singletonsCurrentlyInCreation Set 容器中,在这个集合里
    面的 bean 都是正在实例化的 bean,就是实例化还没做完的 BeanName
    调到 getObject 方法,完成 bean 的实例化。接下来
    getObject 调用完后,就代表着 Bean 实例化已经完成了,这时候就需要
    1、singletonsCurrentlyInCreation 把 beanName 从这个集合中删除
    2、addSingleton,把 bean 缓存到一级缓存中
    createBean 方法
    代码位置:
    AbstractBeanFactory.doGetBean 方法中
    这个方法是 bean 实例化核心方法

     

    实例化方法,把 bean 实例化,并且包装成 BeanWrapper
    点进这个方法里面。
    这个方法是反射调用类中的 factoryMethod 方法。这要知道@Bean 方法的原理,实际上
    spring 会扫描有@bean 注解的方法,然后把方法名称设置到 BeanDefinition 的 factoryMethod
    属性中,接下来就会调到上面截图中的方法实现@Bean 方法的调用。该方法里面的参数解
    析过程不需要了解。
    determineConstructorsFromBeanPostProcessors
    这个方法是 BeanPostProcessor 接口类的首次应用,最终会掉到
    AutowiredAnnotationBeanPostProcessor 类的方法,在方法中会扫描有注解的构造函数然后完
    成装配过程。
  • 相关阅读:
    May 1 2017 Week 18 Monday
    April 30 2017 Week 18 Sunday
    April 29 2017 Week 17 Saturday
    April 28 2017 Week 17 Friday
    April 27 2017 Week 17 Thursday
    April 26 2017 Week 17 Wednesday
    【2017-07-04】Qt信号与槽深入理解之一:信号与槽的连接方式
    April 25 2017 Week 17 Tuesday
    April 24 2017 Week 17 Monday
    为什么丑陋的UI界面却能创造良好的用户体验?
  • 原文地址:https://www.cnblogs.com/haoranzhengqi/p/12169900.html
Copyright © 2011-2022 走看看