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

简介: 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的乌托邦

目录
相关文章
|
5天前
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
34 0
|
3月前
|
安全 Java API
深入解析 Spring Security 配置中的 CSRF 启用与 requestMatchers 报错问题
本文深入解析了Spring Security配置中CSRF启用与`requestMatchers`报错的常见问题。针对CSRF,指出默认已启用,无需调用`enable()`,只需移除`disable()`即可恢复。对于`requestMatchers`多路径匹配报错,分析了Spring Security 6.x中方法签名的变化,并提供了三种解决方案:分次调用、自定义匹配器及降级使用`antMatchers()`。最后提醒开发者关注版本兼容性,确保升级平稳过渡。
381 2
|
4月前
|
缓存 Java API
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
本文介绍了在Spring Boot中配置Swagger2的方法。通过创建一个配置类,添加`@Configuration`和`@EnableSwagger2`注解,使用Docket对象定义API文档的详细信息,包括标题、描述、版本和包路径等。配置完成后,访问`localhost:8080/swagger-ui.html`即可查看接口文档。文中还提示了可能因浏览器缓存导致的问题及解决方法。
143 0
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的配置
|
11天前
|
人工智能 安全 Java
Spring Boot yml 配置敏感信息加密
本文介绍了如何在 Spring Boot 项目中使用 Jasypt 实现配置文件加密,包含添加依赖、配置密钥、生成加密值、在配置中使用加密值及验证步骤,并提供了注意事项,确保敏感信息的安全管理。
|
4月前
|
Java 关系型数据库 数据库
微服务——SpringBoot使用归纳——Spring Boot事务配置管理——Spring Boot 事务配置
本文介绍了 Spring Boot 中的事务配置与使用方法。首先需要导入 MySQL 依赖,Spring Boot 会自动注入 `DataSourceTransactionManager`,无需额外配置即可通过 `@Transactional` 注解实现事务管理。接着通过创建一个用户插入功能的示例,展示了如何在 Service 层手动抛出异常以测试事务回滚机制。测试结果表明,数据库中未新增记录,证明事务已成功回滚。此过程简单高效,适合日常开发需求。
201 0
|
8天前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
35 0
|
3月前
|
前端开发 IDE Java
Spring MVC 中因导入错误的 Model 类报错问题解析
在 Spring MVC 或 Spring Boot 开发中,若导入错误的 `Model` 类(如 `ch.qos.logback.core.model.Model`),会导致无法解析 `addAttribute` 方法的错误。正确类应为 `org.springframework.ui.Model`。此问题通常因 IDE 自动导入错误类引起。解决方法包括:删除错误导入、添加正确包路径、验证依赖及清理缓存。确保代码中正确使用 Spring 提供的 `Model` 接口以实现前后端数据传递。
123 0
|
4月前
|
Java 数据库连接 数据库
微服务——SpringBoot使用归纳——Spring Boot集成MyBatis——MyBatis 介绍和配置
本文介绍了Spring Boot集成MyBatis的方法,重点讲解基于注解的方式。首先简述MyBatis作为持久层框架的特点,接着说明集成时的依赖导入,包括`mybatis-spring-boot-starter`和MySQL连接器。随后详细展示了`properties.yml`配置文件的内容,涵盖数据库连接、驼峰命名规范及Mapper文件路径等关键设置,帮助开发者快速上手Spring Boot与MyBatis的整合开发。
232 0
|
4月前
|
缓存 Java 应用服务中间件
微服务——SpringBoot使用归纳——Spring Boot集成Thymeleaf模板引擎——依赖导入和Thymeleaf相关配置
在Spring Boot中使用Thymeleaf模板,需引入依赖`spring-boot-starter-thymeleaf`,并在HTML页面标签中声明`xmlns:th=&quot;http://www.thymeleaf.org&quot;`。此外,Thymeleaf默认开启页面缓存,开发时建议关闭缓存以实时查看更新效果,配置方式为`spring.thymeleaf.cache: false`。这可避免因缓存导致页面未及时刷新的问题。
107 0
|
4月前
|
Java 数据库 微服务
微服务——SpringBoot使用归纳——Spring Boot中的项目属性配置——指定项目配置文件
在实际项目中,开发环境和生产环境的配置往往不同。为简化配置切换,可通过创建 `application-dev.yml` 和 `application-pro.yml` 分别管理开发与生产环境配置,如设置不同端口(8001/8002)。在 `application.yml` 中使用 `spring.profiles.active` 指定加载的配置文件,实现环境快速切换。本节还介绍了通过配置类读取参数的方法,适用于微服务场景,提升代码可维护性。课程源码可从 [Gitee](https://gitee.com/eson15/springboot_study) 下载。
115 0