在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 类的方法,在方法中会扫描有注解的构造函数然后完
成装配过程。

聊聊spring之bean对象的实例化过程的更多相关文章

  1. java对象的实例化过程

    简单类对象的实例化过程 1.在方法区加载类: 2.在栈内存申请空间,声明变量P: 3.在堆内存中开辟空间,分配对象地址: 4.在对象空间中,对对象的属性进行默认初始化,类成员变量显示初始化: 5.构造 ...

  2. spring中Bean对象的生命周期

    经过测试对于具体的一个Bean,执行的流程应该是: 1.实例化: 常见的有构造(有参.无参)实例化.静态工厂(方法是静态,通过类名.方法返回获取).实例工厂(专门有个类负责生产对象,需要在bean中配 ...

  3. Spring IOC -bean对象的生命周期详解

    生命周期执行的过程如下:1) spring对bean进行实例化,默认bean是单例2) spring对bean进行依赖注入3) 如果bean实现了BeanNameAware接口,spring将bean ...

  4. 获取Spring容器Bean对象工具类

    在开发中,总是能碰到用注解注入不了Spring容器里面bean对象的问题.为了解决这个问题,我们需要一个工具类来直接获取Spring容器中的bean.因此就写了这个工具类,在此记录一下,方便后续查阅. ...

  5. web项目中获取spring的bean对象

    Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,如何在程序中不通过注解的形式(@Resource.@Autowired)获取Spring配置的bean呢? Bean工厂(c ...

  6. 简单模拟Spring管理Bean对象

    1: 首先我们要利用dom4j进行xml的解析,将所有的bean的配置读取出来. 2:利用java的反射机制进行对象的实例化. 3: 直接获得对象 package cn.Junit.test; imp ...

  7. springboot自定义filter获取spring容器bean对象

    今天在自己定义的filter中,想要直接注入spring容器的其它bean进行操作,发现不能正常的注入: 原因:web容器加载顺序导致, 加载顺序是listener——filter——servlet, ...

  8. Spring 为Bean对象执行初始化和销毁方法

    1)初始化: ①可以利用<bean>元素的init-method="方法名"属性指定初始化方法. ②指定的初始化方法是在构造方法调用后自动执行.若非单例模式,则每创建一 ...

  9. Spring中bean的实例化过程

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

随机推荐

  1. [UVA1494] Qin Shi Huang's National Road System

    题目 戳这里 题解 从今天起我要改邪归正,好好刷题准备联赛! 这是一道经典的最小生成树题目. 枚举每一条边作为道士要修的路,求出包含这条边的最小生成树. 先求出原图的最小生成树. 如果要删的边在最小生 ...

  2. 最新中级java面试总结

    最近面试了不少家公司,从一家非外包跳到了外包(委屈脸Ծ‸Ծ),下面总结一下最近的一些心得体会 1.如果在做技术只是为了过日子,而没多大兴趣,那你必须需要考虑一下行业发展方向了.选定一个行业,深入某个行 ...

  3. ubuntu 16.10 shu rufa meiy ou l e geng xi zhi hou

  4. 51Nod 2026 Gcd and Lcm

    题目传送门 分析: 开始玩一个小小的trick 我们发现\(f(n)=\sum_{d|n}\mu(d)\cdot d\)是一个积性函数 所以: \(~~~~f(n)=\prod f(p_i^{a_i} ...

  5. Scala 学习(7)之「trait (1) 」

    作为接口使用 在 triat 中可以定义抽象方法,就与抽象类中的抽象方法一样,只要不给出方法的具体实现即可 类可以使用 extends 关键字继承 trait,注意,这里不是 implement,而是 ...

  6. BeautifulSoup标签定位方法总结

    首先说明一下两个基本函数 .find() 和 .findAll(). find()返回第一个符合要求的标签 findAll()返回一个由所有符合要求的标签组成的列表.除此之外基本相同. 0.直接定位 ...

  7. springcloud Eureka设置服务下线上线事件通知

    最近由于微服务会莫名其妙挂掉,导致一些服务宕机: 固所以寻找解决办法,莫名宕机暂时还未查明原因,先人肉解决办法 Eureka的server端会发出5个事件通知,分别是: EurekaInstanceC ...

  8. 5.场景3:高可用性使用分布式虚拟路由(DVR)

    这个场景描述了使用ML2插件和Open vSwitch的OpenStack网络服务的高可用性分布式虚拟路由(DVR)实现.示例配置创建了一个Flat外部网络和一个VXLAN项目(租户)网络.然而,这种 ...

  9. Ceph 存储集群7-故障排除

    Ceph 仍在积极开发中,所以你可能碰到一些问题,需要评估 Ceph 配置文件.并修改日志和调试选项来纠正它. 一.日志记录和调试 般来说,你应该在运行时增加调试选项来调试问题:也可以把调试选项添加到 ...

  10. 【动手学pytorch】softmax回归

    一.什么是softmax? 有一个数组S,其元素为Si ,那么vi 的softmax值,就是该元素的指数与所有元素指数和的比值.具体公式表示为: softmax回归本质上也是一种对数据的估计 二.交叉 ...