Spring 框架提供了两大功能: IoC 和 AOP,它能对 bean 的全生命周期进行管理。
其它框架如果能被纳入到 Spring 容器的管理的话,那么这个框架的 bean 也就具备了 IoC 和 AOP 的能力。
所以,其他框架与 Spring 整合的过程,可以理解为"将其他框架纳入到 Spring 容器中来管理"的过程。
前面的文章已经透过源码分析过了 IoC 和 AOP,这里,再对 Spring 框架来进行一个小小的总结。
Spring 5.3.9 (通过 SpringBoot 2.5.3 间接引入的依赖)
Spring 框架为了实现 IoC 的功能,引入了 Spring BeanFactory 容器的概念(即:Spring IoC 容器)。
Spring 框架要处理的主要功能可以概括为 3 块:
下面我们通过流程图的方式来展现一下 Spring 的处理过程,记录一下关键的处理类 和 处理流程,方便更好的理解 Spring,也方便快速的定位到关键的处理类。
我们讲 Spring 容器,通常都是说的 Spring 的 bean 容器,也就是 BeanFactory(org.springframework.beans.factory.BeanFactory
)。
下面几种叫法说的是同一个东西:
Spring 容器
Spring bean 容器
Spring IoC 容器
Spring BeanFactory 容器
BeanFactory 的初始化主要是通过 AbstractApplicationContext#refresh()
来完成的,主要过程如下:
AbstractApplicationContext#refresh()
IoC 是"控制反转" 和 “依赖注入” 功能的总称。
BeanFactory 初始化流程中 finishBeanFactoryInitialization()
会触发所有非 lazy bean 的加载。也就是会进行 bean 实例的创建 和 依赖关系的注入。
bean 的创建过程过程主要可分为三步:
其中,Aware 接口设置值有两个地方会触发,触发的先后顺序不太一样:
AbstractAutowireCapableBeanFactory#invokeAwareMethods()
处理 BeanNameAware、BeanClassLoaderAware、BeanFactoryAware
是在 initializeBean() 时最先触发的,属于 bean 创建的第三步。
ApplicationContextAwareProcessor#invokeAwareInterfaces()
处理 EnvironmentAware、EmbeddedValueResolverAware、ResourceLoaderAware、ApplicationEventPublisherAware、MessageSourceAware、ApplicationStartupAware、ApplicationContextAware
是 BeanPostProcessor#postProcessBeforeInitialization() 触发的,属于 bean 创建的第三步
所以,Aware 接口设置值有两个地方会触发,但是都是在 bean 创建的第三步 initializeBean
时调用的。
Spring 中通过 Pointcut 来将 bean 中的 join point 与 Advisor 进行匹配。
AOP 动态代理类的创建是在 bean 的创建过程的第三步 initializeBean
时,通过 AnnotationAwareAspectJAutoProxyCreator#postProcessAfterInitialization()
来创建的。
在 Spring 中,AOP 代理类是放在 BeanPostProcessor
这个扩展点中来处理的。具体是通过 AnnotationAwareAspectJAutoProxyCreator#postProcessAfterInitialization
来实现的。
AnnotationAwareAspectJAutoProxyCreator 的类图如下:
创建 AOP 代理类的主要功能是由 AbstractAutoProxyCreator
来完成的。
AbstractAutoProxyCreator:
它是 BeanPostProcessor 的实现类,它会获取到所有与 bean 相匹配的 advisor,用于创建 AOP 代理类。
AnnotationAwareAspectJAutoProxyCreator:
它继承了 AbstractAutoProxyCreator,它能从 application context 中获取所有 AspectJ 注解形式的 advisor 用于创建 AOP 代理类。
在 Spring 中,AOP 代理类的创建主要是由 AbstractAutoProxyCreator 来完成的,具体的实现类是 AnnotationAwareAspectJAutoProxyCreator。
其实,在 Spring 中还有一个类 AbstractAdvisingBeanPostProcessor 也用于生成 AOP 代理类,只不过它是指定 advisor 的方式来生成 AOP 代理类的。
@Transactional 是通过 AbstractAdvisorAutoProxyCreator 来实现的。
@Async 是通过 AbstractAdvisingBeanPostProcessor 来实现的。
具体可以查看:
【Spring源码三千问】Spring AOP 中 AbstractAdvisorAutoProxyCreator、AbstractAdvisingBeanPostProcessor的区别
【老王读Spring AOP-5】@Transactional产生AOP代理的原理
【老王读Spring AOP-6】@Async产生AOP代理的原理
在创建 AOP 代理类之前,需要提前将所有的 Advisor 都找出来,然后,在创建代理类时,再通过 AspectJ 表达式去匹配与当前 bean 相关的 Advisor。
proxyTargetClass 标识决定了到底使用 cglib 还是 JDK proxy。
关于 proxyTargetClass 的知识请戳:【Spring源码三千问】Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?
Spring AOP 代理类的实现有两种:JDK proxy 或者是 CGLIB proxy。
执行 AOP 代理类的 Advice 时,都会经过两步:
Spring 框架提供了 IoC 和 AOP 两大功能,它能对 bean 的全生命周期进行管理。
Spring 框架的主要功能可以概括为 3 块:
掌握了 IoC 和 AOP 的原理之后,对 Spring 的二次封装扩展 和 与其他框架整合大有裨益。
当项目启动报错时,也能结合源码的知识快速定位出原因。
课程 | 地址 |
---|---|
SpringIoC源码解读由浅入深 | https://edu.51cto.com/sd/68e86 |
如果本文对你有所帮助,欢迎点赞收藏!
源码测试工程下载:
老王读Spring IoC源码分析&测试代码下载
老王读Spring AOP源码分析&测试代码下载
公众号后台回复:下载IoC 或者 下载AOP 可以免费下载源码测试工程…
阅读更多文章,请关注公众号: 老王学源码
系列博文:
【老王读Spring AOP-0】SpringAop引入&&AOP概念、术语介绍
【老王读Spring AOP-1】Pointcut如何匹配到 join point
【老王读Spring AOP-2】如何为 Pointcut 匹配的类生成动态代理类
【老王读Spring AOP-3】Spring AOP 执行 Pointcut 对应的 Advice 的过程
【老王读Spring AOP-4】Spring AOP 与Spring IoC 结合的过程 && ProxyFactory 解析
【老王读Spring AOP-5】@Transactional产生AOP代理的原理
【老王读Spring AOP-6】@Async产生AOP代理的原理
【Spring 源码阅读】Spring IoC、AOP 原理小总结
相关阅读:
【Spring源码三千问】Spring动态代理:什么时候使用的 cglib,什么时候使用的是 jdk proxy?
【Spring源码三千问】Advice、Advisor、Advised都是什么接口?
【Spring源码三千问】没有AspectJ,Spring中如何使用SpringAOP、@Transactional?
【Spring源码三千问】Spring AOP 中 AbstractAdvisorAutoProxyCreator、AbstractAdvisingBeanPostProcessor的区别
【Spring 源码三千问】同样是AOP代理bean,为什么@Async标记的bean循环依赖时会报错?