从根儿上学习spring 三 之依赖注入原理了解

上篇我们留下了关于ConfigurationClassPostProcessor的两个问题。在讨论这两个问题前我们先说点别的。

我们说过spring作为一个程序的开源框架为我们提供了很多的扩展点,利用这些扩展点我们可以干预bean的创建和初始化过程。所谓的扩展点大家可不敢想的有多高大上多复杂的东西。举个例子,你为公司所有业务部门写了一个针对一些中间件优雅下线的通用功能,可你不确定后面公司业务部门会不会后面引入其它的中间件,所以你定义了一个接口GraceDownInteface,接口里定义一个下线方法,规定所有实现了该接口的方法在服务挂掉前都会被自动执行。这里的GraceDownInteface就是一个扩展。

spring的依赖注入过程根据我们上篇的猜测,最起码包含1.class扫描获取需要注入的类;2.处理这些class类为BeanDefinition对象后面创建bean对象做准备(这里的beanDefinition就是每个class对象里的信息的解析结果,比如会存储里面有哪些字段,每个字段有没有注解,哪些方法等等)

3.根据第2步处理好的数据创建bean实例;4.为这些bean设置属性(依赖注入);

针对上面的步骤我们都可以对其做扩展处理,并且可以在每步的前后都可以做扩展处理。而第1,2步扩展的对象主要是spring的bean容器进行扩展,因为这时候还没创建出bean。针对第3,4步我们可以针对bean实例进行扩展。

所以在spring中为我们主要提供了两个扩展接口分别是针对spring容器的BeanFactoryPostProcessor和针对bean实例的BeanPostProcessor。post processor的意思是后置处理器大家理解它是扩展点就行,别纠结”后置“这两个字把它简单理解成扩展接口就行。前面的beanFactory和bean分别代表需要扩展的对象,BeanFactory是spring的 bean容器,bean就是spring创建的bean实例。

而我们今天要讲的主角ConfigurationClassPostProcessor就是BeanFactoryPostProcessor的子接口。spring将上面的第1,2步交给了ConfigurationClassPostProcessor来做,BeanFactory里维护了所有的beanDefinition,它对BeanFactory进行扩展获取解析所有beanDefinition并设置到beanFactory中。

至于ConfigurationClassPostProcessor到底是怎么做的不在今天的讨论范围里,这里我简单说下。前面我们已经说过了我们的启动类TestMain.class已经被提前放到了beanFactory中了,ConfigurationClassPostProcessor既然可以拿到beanFactory当然可以拿到里面存的TestMain.class对应的BeanDefinition,那么就可以拿到TestMain.class上的@SpringBootApplication注解信息,这样就可以确定是从TestMain.class所在的包路径开始扫描所有的class类了,再根据我们加的需要被依赖注入的标记注解如@compentment或者@service等就可以获取到所有需要被依赖注入的BeanDefinition,这样我们上面的第1,2步就可以完成了。

ConfigurationClassPostProcessor如此重要,它是什么时候被spring管理起来的呢,spring的bean的生命周期中又有哪些后置处理器在提供扩展呢?为了彻底了解spring的原理后面我们准备从以springboot作为讲解,从其启动类的main方法作为入口一步步看springboot的启动过程了解整个springboot的启动流程及原理。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值