Spring源码学习之Spring Bean的生命周期以及Spring后置处理器

最近在学习Spring源码,整理一些学习笔记,希望能够帮助自己结构化的梳理知识,如果凑巧能帮助到大家,无上荣幸。当然笔记中会有我自己一些理解性的内容,可能出现不全面甚至错误的东西,大家甄别后谨慎参考哈。

既然是Spring Bean的生命周期管理先说明下什么是Spring Bean,他和普通的java类有什么区别,我的理解是Spring Bean是通过Spring容器在保留我们自己写的业务代码原有逻辑的前提下,通过技术手段将类初始化、实例化甚至增强成一个新类的过程,这个过程就是Spring Bean的生命周期。

Spring容器(ApplicationContext)有多种实例化的方式,比如:
ClassPathXmlApplicationContext 从XML中装配
AnnotationConfigApplicationContext 从注解中装填
我主要说明AnnotationConfigApplicationContext的实例化过程,Spring在实例化AnnotationConfigApplicationContext对象时,通过Scan方法扫描出所有需要实例化的类,比如添加了@Component注解,源码如下:
在这里插入图片描述
这个refresh方法做了很多事,这里不展开一一讨论,只讲后边需要用到的知识:
1、扫描、解析需要装配的类
2、初始化BeanDefinition:把1步中扫描到需要装配的类put到BeanDefinition对象的集合中(Bean的描述对象,其中包含Bean名称、是否是单例、是否是懒加载等等,你可以理解为一个Bean可能有什么属性,这个对象中就有一个对应的属性描述它)
3、遍历3中的set通过反射等JDK提供的技术手段将所有类进行实例化,添加到Spring单例池中供使用

这么看好像spring很简单啊,但是SpringNB就NB在上述的过程中,几乎每一步都是支持程序员人工干预的,照例我们不展开一一的讲,拿BeanPostProcessor举例,我们通过继承这个类,可以拿到2步中的BeanDefinition,说到这里,其实大多数人已经知道了,我们既然拿到里即将初始化类的描述对象,那我们现在对这个对象进行的任何操作,都会被神不知鬼不觉的实例化到Spring的容器中,比如说上边提到的Bean名称,你可以把它从Test1改成Test2,这样你的代码中本来没有初始化这个Test2,你莫名其妙的就能用了,而且里边的属性和方法就是原来Test1类中的。
简单的想通过这个过程你就能理解为什么Spring可以实现AOP了,他可以拿到你类中的任何内容并且进行加工后实例化,那是不是我相加什么就加什么呢,但是Spring的后置处理器还没那么简单,咱们简单理解可以认为有9步,上一个盗来的图:
在这里插入图片描述
这个图基本能够说明Spring中后置处理器的执行内容和步骤。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值