Spring配置类深度剖析-总结篇(手绘流程图,可白嫖)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Spring配置类专栏的总结篇,绘制流程图,适合需快速掌握的白嫖党

生命太短暂,不要去做一些根本没有人想要的东西。本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈、MyBatis、JVM、中间件等小而美的专栏供以免费学习。关注公众号【BAT的乌托邦】逐个击破,深入掌握,拒绝浅尝辄止。

前言

各位好,我是A哥。最近写了好几篇关于Spring @Configuration的文章,收录在Spring配置类专栏里,这是本公众号的第一个专栏(虽然CSDN里已有几百篇)。虽然写的过程很艰难,但从评价反馈来看都是正向的,聊以安慰呗,比如这个小伙的“三宗最”让我听了很开心啊😄:

虽然每篇文章的阅读量堪忧,毕竟从第一篇文章我就对我自己的公众号定位了嘛:不求大量流行,只求小众共鸣。因为我知道愿意坚持看下去系列文章(强依赖于上下文)的小伙伴还是比较少的,但我相信一旦坚持下来我们的共同话题就多了,“臭味相投”嘛,是这样的吧~

在这之前,CSDN里写过几百篇关于Spring的文章,但是总感觉体系性不够,东打一炮,西放一枪难免会有失连贯性。我一直认为大多时候技术的相关性、上下文上很必要的,仅靠一篇文章想把一个成型的知识点讲清楚几乎没可能,所以那种容易成为快餐,过眼即忘。这不这次我选择在公众号里做些成系列的专题,在CSDN的基础上,抽取精华,去其糟粕,以自身能力尽量的做好每一个专栏,普惠于有需要的小伙伴。过程很枯燥和很乏味,愿意看下去的人也不会很多,能坚持下来或许会被自己感动😄。

作为第一个专栏的总结篇,一般的都是少文字多流程图,旨在起到一个总览的作用,也为方便快速应付面试~


版本约定

本文内容若没做特殊说明,均基于以下版本:

  • JDK:1.8
  • Spring Framework:5.2.2.RELEASE

正文

本文以绘制流程图为主,特点是快,缺点是不详,辅以该专栏(关注公众号,进入该专栏。或点击顶部相关推荐直达)前几篇文章可以达到很好的效果。


相关类

  • @Configuration:标注在类上,表示该类是个Full模式的配置类

    • 自Spring 5.2.0版本后它加了个proxyBeanMethods属性来显示控制Full模式还是Lite模式,默认是true表示Full模式
  • @Bean:标注在方法上,表示方法生成一个由Spring容器管理的Bean
  • ConfigurationClassPostProcessor:用于引导处理@Configuration配置类的后置处理器。注意:它只是引导处理,并不是实际处理
  • ConfigurationClassUtils:内部工具类。用于判断组件是否是配置类,又或是Full模式/Lite模式,然后在bd元数据里打上标记

    • 它还会处理一件小事:获取@Configuration配置类上标注的@Order排序值并放进bd里
  • BeanMethod:内部使用的类。用于封装标注有@Bean注解的方法
  • ConfigurationClass:内部使用的类。每一个@Configuration配置类都会被封装为它,内部会包含多个@Bean方法(BeanMethod)
  • ConfigurationClassParser:解析@Configuration配置类,最终以ConfigurationClass对象的形式展示,并且填充它:因为一个配置类可以@Import导入另外一个(或者N多个)其它配置类,所以需要填充
  • ConfigurationClassBeanDefinitionReader:内部使用的类。读取给定的已经解析好的Set<ConfigurationClass>集合,把里面的bd信息注册到BeanDefinitionRegistry里去(这里决定了bd的有序和无序相关问题)
  • ConfigurationClassEnhancer:内部使用的类。配置类增强器,用于对@Configuration类(Full模式)使用CGLIB增强,生成一个代理子类字节码Class对象
  • EnhancedConfiguration:被增强器增强过的配置类,都会自动的让实现此接口(实际是个BeanFactoryAware)接口
  • SpringNamingPolicy:使用CGLIB生成字节码类名名称生成策略 -> 名称中会有BySpringCGLIB字样
  • BeanFactoryAwareMethodInterceptor:CGLIB代理对象拦截器。作用:拦截代理类的setBeanFactory()方法,给对应属性赋值
  • BeanMethodInterceptor:CGLIB代理对象拦截器。作用:拦截所有@Bean方法的执行,以支持可以通过直接调用@Bean方法来管理依赖关系(当然也支持FactoryBean模式)

配置类解析流程图

配置类的解析均是交由ConfigurationClassPostProcessor来引导。在Spring Framework里(非Spring Boot)里,它是BeanDefinitionRegistryPostProcessor处理器的唯一实现类,用于引导处理@Configuration配置类。解析入口是postProcessBeanDefinitionRegistry()方法,实际处理委托给了processConfigBeanDefinitions()方法。


配置类增强流程图

如果一个配置类是Full模式,那么它就需要被CGLIB字节码提升。增强动作委托给enhanceConfigurationClasses(beanFactory)去完成。

以上是引导/调度的流程图,下面对字节码增强、实际拦截实现流程进行细分描述。


生成增强子类字节码流程图

针对于Full模式配置类的字节码生成,委托给ConfigurationClassEnhancer增强器去完成,最终得到一个CGLIB提升过的子类Class字节码对象

字节码实际是由Enhancer生成,就不用再深入了,那属于CGLIB(甚至ASM)的范畴,很容易头晕,也并无必要。


拦截器执行流程图

拦截器是完成增强实际逻辑的核心部件,因此它的执行流程需要引起重视。一共有两个“有用”的拦截器,分别画出。


BeanFactoryAwareMethodInterceptor拦截流程图

拦截setBeanFactory()方法的执行


BeanMethodInterceptor拦截流程图

拦截@Bean方法的执行


总结

本文作为公众号首个专栏Spring配置类的总结篇,主要是对核心处理流程画图阐述,适合需要快速理解的白嫖党,毕竟面试最喜欢问的就是让你说说执行流程之类的,因此实用性还是蛮高的,以后的专栏均会仿造此套路来玩。

关于Spring配置类这个专栏到这就全部结束了,在此也多谢各位在这期间给我的反馈,让我确定以及肯定了这么坚持下去是有意义的,是被支持的,是能够帮助到同仁们的。我公众号定位为专栏式学习,拒绝浅尝遏止,诚邀你的关注,一起进步。

Tips:有小伙伴私信我说有没有入门级别的?答案是没有的。主要是觉得入门级文章网上太多了,趋同性很强,所以我这一般会篇进阶,有点工作经验/基础再看效果更佳


关注A哥

Author A哥(YourBatman)
个人站点 www.yourbatman.cn
E-mail yourbatman@qq.com
微 信 fsx641385712
活跃平台
公众号 BAT的乌托邦(ID:BAT-utopia)
知识星球 BAT的乌托邦
每日文章推荐 每日文章推荐

BAT的乌托邦

目录
相关文章
|
12天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
31 0
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
48 4
|
1月前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
38 0
|
29天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
22天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
30 1
|
1月前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
139 1
|
2月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
233 1
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
47 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
82 0
|
1月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
41 0
下一篇
无影云桌面