Spring Boot 灵活实现自动配置背后的故事~用起来更香了

ESP32S3学习——i2c,点亮0.96寸oled 阅读详情

最近一直忙着在做新应届生的员工技术培训和面试 ,培训的则是Spring Boot部分的内容,这部分也是面试常问的点,于是想到了各位读者大大,特地的把内容分享大家一份。

不知道大家第一次搭Spring Boot环境的时候,有没有觉得非常简单。无须各种的配置文件,无须各种繁杂的pom坐标,一个main方法,就能run起来了。与其他框架整合也贼方便,使用EnableXXXXX注解就可以搞起来了!

所以咱们今天来讲讲Spring Boot是如何实现自动配置的~

首先咱们依旧来个总结:

Spring Boot自动配置流程图:

自动配置流程图

 (▲如果图片看不清楚,可以添加名片回复:自动配置流程图,获取清晰版的全图)

看完流程图我们来一步步的分析(代码有点多干货同样也很多)

首先看源码的话我们就先从启动类开始入手:

@Spring BootApplication:Spring Boot应用标注在某个类上说明这个类是Spring Boot的主配置类,Spring Boot需要运行这个类的main方法来启动Spring Boot应用;

Spring BootApplication 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented@Inherited
@Spring BootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {      
@Filter(type = FilterType.CUSTOM, classes =TypeExcludeFilter.class),      
@Filter(type = FilterType.CUSTOM, classes =AutoConfigurationExcludeFilter.class) })
public @interface Spring BootApplication {

 

注解说明

注解说明
@Target(ElementType.TYPE)设置当前注解可以标记在哪
@Retention(RetentionPolicy.RUNTIME)

RetentionPolicy.RUNTIME会被jvm加载

RetentionPolicy.RUNTIMEjavadoc会生成注解信息
会被jvm加载
@Inherited是否会被继承
@Spring BootConfiguration:Spring Boot的配置类;标注在某个类上,表示这是一个Spring Boot的配置类;
@Configuration::配置类上来标注这个注解;配置类-----配置文件;配置类也是容器中的一个组件;@Component
@EnableAutoConfiguration:开启自动配置功能;以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉Spring Boot开启自动配置,会帮我们自动去加载自动配置类
@ComponentScan:扫描包相当于在spring.xml配置中但是并没有指定basepackage,如果没有指定spring底层会自动扫描当前配置类所有在的包
TypeExcludeFilterSpring Boot对外提供的扩展类,可以供我们去按照我们的方式进行排除
AutoConfigurationExcludeFilter排除所有配置类并且是自动配置类中里面的其中一个

精彩点来了

@EnableAutoConfiguration

在这个注解里面,最主要的就是@EnableAutoConfiguration,这么直白的名字,一看就知道它要开启自动配置,Spring Boot要开始天秀了,于是默默进去@EnableAutoConfiguration的源码。

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)
@Documented@Inherited@AutoConfigurationPackage
@Import(EnableAutoConfigurationImportSelector.class)
public@interfaceEnableAutoConfiguration{
//略}

@AutoConfigurationPackage

将当前配置类所在包保存在BasePackages的Bean中。供Spring内部使用。

@AutoConfigurationPackage

@Import(AutoConfigurationPackages.Registrar.class)
//保存扫描路径,提供给spring-data-jpa需要扫描
@Entitypublic@interfaceAutoConfigurationPackage{

  1. 就是注册了一个保存当前配置类所在包的一个Bean

@Import(EnableAutoConfigurationImportSelector.class)关键点!

可以看到,在@EnableAutoConfiguration注解内使用到了@import注解来完成导入配置的功能,而EnableAutoConfigurationImportSelector实现了DeferredImportSelectorSpring内部在解析@Import注解时会调用getAutoConfigurationEntry方法,这块属于Spring的源码,有点复杂,我们先不管它是怎么调用的。下面是2.3.5.RELEASE实现源码:

getAutoConfigurationEntry方法进行扫描具有META-INF/spring.factories文件的jar包。

任何一个Spring Boot应用,都会引入spring-boot-autoconfigure,而spring.factories文件就在该包下面。spring.factories文件是Key=Value形式,多个Value时使用,隔开,该文件中定义了关于初始化,监听器等信息,而真正使自动配置生效的key是org.springframework.boot.autoconfigure.EnableAutoConfiguration,如下所示:

等同于

@Import({
#AutoConfigure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
...省略
org.springframework.boot.autoconfigure.websocket.WebSocketMessagingAutoConfiguration,\
org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration
})

每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置;

所有自动配置类表

  • 每一个自动配置类进行自动配置功能;

后续:@EnableAutoConfiguration注解通过@Spring BootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(...)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中

以HttpEncodingAutoConfiguration(Http编码自动配置)为例解释自动配置原理;

我们看看对应的注解阐述:

注解说明
@Configuration(proxyBeanMethods=false)标记了@ConfigurationSpring底层会给配置创建cglib动态代理。作用:就是防止每次调用本类的Bean方法而重新创建对象,Bean是默认单例的
@EnableConfigurationProperties(ServerProperties.class)

启用可以在配置类设置的属性对应的类

@xxxConditional根据当前不同的条件判断,决定这个配置类是否生效?

@Conditional派生注解(Spring注解版原生的@Conditional作用)作用:必须是@Conditional指定的条件成立,才给容器中添加组件,配置配里面的所有内容才生效;
@Conditional扩展注解作用(判断是否满足当前指定条件)
@ConditionalOnJava系统的java版本是否符合要求
@ConditionalOnBean容器中存在指定Bean;
@ConditionalOnMissingBean容器中不存在指定Bean;
@ConditionalOnExpression满足SpEL表达式指定
@ConditionalOnClass系统中有指定的类
@ConditionalOnMissingClass系统中没有指定的类
@ConditionalOnSingleCandidate容器中只有一个指定的Bean,或者这个Bean是首选Bean
@ConditionalOnProperty系统中指定的属性是否有指定的值
@ConditionalOnResource类路径下是否存在指定资源文件
@ConditionalOnWebApplication当前是web环境
@ConditionalOnNotWebApplication当前不是web环境
@ConditionalOnJndiJNDI存在指定项


我们怎么知道哪些自动配置类生效;

我们可以通过设置配置文件中:启用debug=true属性;来让控制台打印自动配置报告,这样我们就可以很方便的知道哪些自动配置类生效;

下面我么就以HttpEncodingAutoConfiguration(Http编码自动配置)为例说明自动配置原理;

该注解如下:

  •  @Configuration:表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件。
  • @ConditionalOnWebApplication:Spring底层@Conditional注解(Spring注解版),根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效;判断当前应用是否是web应用,如果是,当前配置类生效。

  • @ConditionalOnClass:判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器。

  • @ConditionalOnProperty:判断配置文件中是否存在某个配置spring.http.encoding.enabled;如果不存在,判断也是成立的

即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的。

  • @EnableConfigurationProperties({ServerProperties.class}):将配置文件中对应的值和ServerProperties绑定起来;并把ServerProperties加入到IOC容器中。并注册ConfigurationPropertiesBindingPostProcessor用于将@ConfigurationProperties的类和配置进行绑定

ServerProperties

ServerProperties通过@ConfigurationProperties注解将配置文件与自身属性绑定。

对于@ConfigurationProperties注解小伙伴们应该知道吧,我们如何获取全局配置文件的属性中用到,它的作用就是把全局配置文件中的值绑定到实体类JavaBean上面(将配置文件中的值与ServerProperites绑定起来),而@EnableConfigurationProperties主要是把以绑定值JavaBean加入到spring容器中。

到这里,小伙伴们应该明白,我们在application.properties声明spring.application.name是通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。

所以只有知道了自动配置的原理及源码才能灵活的配置Spring Boot

粉丝福利

以上这几个就是今天给大家分享的内容,除此之外,我还为每位粉丝准备了一份全面的资料福利,从面试简历模板到大厂面经汇总,从大厂内部技术资料到互联网高薪必读书单,以及Java面试核心知识点(283页)和Java面试题合集2022年最新版(485页)等等,有需要的可以点下方名片领取

华为嵌入式面试题及参考答案(持续更新) 异步是指在程序执行过程中,某些任务不需要等待立即完成就可以继续执行其他任务的过程。在计算机编程中,异步通常用于处理长时间运行的操作,如文件读写、网络通信等,以避免阻塞主线程。异步处理通常涉及到回调函数、事件循环、协程或未来的概念。使用宏定义来避免命名冲突。#else#endif堆和栈是计算机程序中用于存储数据的两种不同类型的内存区域。 阅读详情

相关推荐

用Python玩转Carla-Apollo联合仿真:手把手教你实现自动驾驶测试

本文详细介绍了如何使用Python实现Carla-Apollo联合仿真,从环境搭建到自动驾驶算法测试的全流程。通过Carla提供的高逼真仿真环境和Apollo的自动驾驶算法栈,开发者可以高效验证感知、规划和控制模块。文章包含环境配置、Python API操作、桥接实现及实战测试,为自动驾驶开发提供完整解决方案。

wasm7browser的博客 268

SpringBoot源码学习之@EnableConfigurationProperties原理机制

目录前言用法原理 前言 用法 定义一个与application.yml中属性配置相对应的实体类,比如ServerProperties 在ServerProperties中添加@ConfigurationProperties注解,指定prefix 在@Configuration配置类中添加@EnableConfigurationProperties(ServerProperties.class) 使用方式,可以透过@Bean方法中的入参或者在Spring Bean中用@Autowired注解都可以。 原理

Dream2World,SayHi 1165

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

weixin_57514792的博客 1105

【SprinBoot】EnableConfigurationProperties 注解原理和使用(2.0.6版本)

1EnableConfigurationProperties 属性配置启动流程图 EnableConfigurationProperties,在SpringBoot的注释中是这样说明的:为带有@ConfigurationProperties注解的Bean提供有效的支持。这个注解可以提供一种方便的方式来将带有@ConfigurationProperties注解的类注入为Spring容器的Bean。 核心: A:ConfigurationPropertiesBeanRegist...

qfzhangwei的专栏 2052

在ros里给机械臂加上夹爪和底盘后,控制真实机械臂

使用ur3_bringup 可以连接真实机械臂 使用官方的ur3_moveit_planning_execution.launch 可以对机械臂 moveit规划。 但是只有机械臂,没有夹爪。 官方如图: 我把原来的ur3_moveit_config 复制出来,修改 然后把ur3.xacro 等模型文件复制出来修改,修改完之后,有了夹爪,有了底盘。 规划组什么的使用moveit setup assistant 配置过了。 在rviz中可以笛卡尔空间规划了。 ...

超级菜 2719

「分治法」最近点对距离问题

一、问题描述 给定平面S上n个点,找其中的一对点,使得在n个点组成的 所有点对中,该点对间的距离最小。 假设所讨论的点是以标准笛卡儿坐标形式(x, y)给出的。因 此,在两个点Pi =(xi , yi )和Pj =(xj , yj )之间的距离是标准的欧几里德 距离: d = 根号下( x i − x j ) 2 + ( y i − y j )2 二、问题分析 直接用暴力解法很简单,用结构体把每个点的x、y坐标都存下来之后,用一个二重循环即可获得距离的最大值。但是这样做的时间复杂度也达到了O(n的平方)

Laok0413的博客 9656

@EnableConfigurationProperties注解的作用

@EnableConfigurationProperties注解的作用:让使用@ConfigurationProperties注解的类生效,并将该类注入到IOC容器中。 @ConfigurationProperties的作用:将配置文件中的相关属性与Java Bean进行动态绑定 // 注解作用:使WebMvcProperties、ResourceProperties、ResourceProperties上标注的@ConfigurationProperties注解生效,并将其注入到IOC容器中 @Enabl

今天你emo了吗? 1038

大学生数学建模赛题解析及优秀论文-2021电工杯A题高铁牵引供电系统运行数据分析及等值建模(附Python代码)

我国是世界上电气化铁路运营里程最长、服役电力机车型号最多、运营最 繁忙的国家。截至 2020年底,我国铁路年消耗电量约800亿千瓦时,约占三峡 年总发电量的 80%。图1为高速铁路牵引供电系统示意图,主要包括牵引变电所、牵引网和动车 组。牵引变电所将 220kV三相电压转换为满足电力机车运行的27.5kV单相电压, 其核心元件是牵引变压器。牵引网由馈线、接触网、钢轨、回流线等组成,完成 对电力机车的送电任务。...

wenyusuran的专栏 3170

@EnableConfigurationProperties注解

目录 1.概述 2.测试 2.1 使用@EnableConfigurationProperties进行注册 2.2 使用 @Component 注册 3.项目中的使用场景 1.概述 @EnableConfigurationProperties注解的作用是:使 使用 @ConfigurationProperties 注解的类生效。 如果一个配置类只配置@ConfigurationProperties注解,而没有使用@Component或者实现了@Component的其他注解,那..

weixin_38972910的博客 1万+

在 IW31 录入班次与当班负责人,并让 IW38 列表同步显示:基于 IWO10018 + IWOC0004 的一套可落地增强方案

摘要 本文详细介绍了在SAP PM模块中实现工厂设备维护订单增强的完整方案,重点解决两个核心需求:在订单创建时新增班次负责人和班次字段,并在订单列表中直接显示这些信息。文章从需求分析、技术设计到具体实现步骤进行了系统阐述。 关键实现步骤包括: 通过CI_AUFK结构扩展AUFK表,确保字段持久化存储 使用IWO10018增强在IW31/IW32/IW33事务中添加输入界面 通过IWOC0004增强在IW38订单列表中显示新增字段 采用优化的数据填充策略提升性能 该方案不仅满足业务需求,还考虑了用户体验和系统

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 181

基于深度学习的目标检测在 Android 端的优化实现:YOLO Mobile × NPU 加速实战教程

随着国产手机芯片日益强大,终端侧的目标检测任务已经具备实用性基础。本文围绕实际工程场景,详细讲解如何在 Android 应用中部署轻量级目标检测模型(如 YOLO Mobile、EfficientDet Lite),并结合国产手机 NPU 能力,实现高性能、低延迟、实时目标检测系统。文章将涵盖从模型选择、结构优化、量化转换到 Android 上推理加速、UI 实时渲染的全链路工程路径,强调每一环节的真实可复现性与部署细节,适合 AI 工程师、移动开发者及企业级应用落地团队参考使用。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1410

Spring Boot 系列教程(一)@ConditionalOnProperty使用详解

Spring boot 中的使用 在spring boot源码中,涉及到http编码的自动装配等大量的使用到了@ConditionalOnProperty的注解。 HttpEncodingAutoConfiguration类中部分源代码: @Configuration( proxyBeanMethods = false ) @EnableConfigurationProperties({ServerProperties.class}) @ConditionalOnWebApplicati

xiami_17_pangdun的博客 3234

把机器学习“搬进”数据库:SAP HANA PAL 快速上手与 ABAP AMDP 实战

摘要:本文探讨了SAP HANA PAL(Predictive Analysis Library)在企业数据分析中的实践应用。PAL通过将机器学习算法下推到数据库内部执行,有效解决了大数据量场景下的数据搬运瓶颈和治理成本问题。文章详细介绍了PAL的核心功能(包括聚类、分类、回归等10类算法)、使用前提(版本、组件和权限要求)以及通过AMDP实现ABAP与PAL集成的技术方案。重点阐述了参数表设计理念和两个典型应用场景:利用PageRank算法分析企业权限网络关系,以及通过PAL_SCALE进行特征预处理。文

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 5739

SpringBoot之@ConfigurationProperties、@EnableConfigurationProperties

这个注解不仅可以为yml某个类注入还可以为第三方bean绑定属性只要将对应的yml类对象声明实体pojo并交给spring容器管理,再在类上使用@ConfigurationProperties绑定对应的类名即可涉及到两个知识点,这个类对象要交给spring容器管理,则需要将它声明为bean对象,需要用@Conponent注解,第二个需要@ConfigurationProperties(“xxx”),指明为yml中哪个类(xxx)

EmpressL的博客 783

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SpringBoot基础学习之SpringBoot配置(下篇)

前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师。 这个SpringBoot基础学习系列用来记录我学习SpringBoot框架基础知识的全过程 (这个系列是参照B站狂神的SpringBoot最新教程来写的,由于是之前整理的,但当时没有发布出来,所以有些地方可能有错误,希望大家能够及时指正!) 之后我将会以一天一更的速度更新这个系列,还没有学习SpringBoot的小伙伴可以参照

weixin_45301250的博客 458

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

springboot-自动配置

springboot自动配置原理

wssc63262的博客 933

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【Spring Boot-@ConfigurationProperties注解的使用】

目标:一、@ConfigurationProperties注解配置自定义Bean二、@ConfigurationProperties注解&@EnableConfigurationProperties配合使用配置自定义Bean三、@ConfigurationProperties注解配置第三方Bean四、@Config...

weixin_41110115的博客 679

SpringBoot复习:(40)@EnableConofigurationProperties注解的用法

【代码】SpringBoot复习:(40)@EnableConofigurationProperties注解的用法。

amadeus_liu2的博客 868

ChatGPT:@EnableConfigurationProperties 和 @ConfigurationProperties注解

ChatGPT:@EnableConfigurationProperties 和 @ConfigurationProperties注解

XRT_knives的博客 768

SpringBoot_day01自动配置

自动配置 自动装配原理 自动配置原理流程图 ========================================================================= 【全图放不下,此处引入别人已经整理好的图片】 原作者地址:https://www.processon.com/view/link/5fc0abf67d9c082f447ce49b =====================================================================

风归去. 310

springboot10-servlet自定义配置

嵌入式servlet配置修改 SpringBoot默认使用Tomcat作为嵌入式的Servlet容器 嵌入式tomcat:tomca-embed-core 问题? 1)、如何定制和修改Servlet容器相关配置; ​ 1.修改和server有关的配置:(ServerProperties.class) server.port=8081 server.servlet.context-path=/og...

qq_41617848的博客 452

SpringBoot AutoConfigure学习总结

SpringBoot 优点 自动配置是Spring Boot的最大亮点,完美的展示了CoC约定由于配置。Spring Boot能自动配置Spring各种子项目(Spring MVC, Spring Security, Spring Data, Spring Cloud, Spring Integration, Spring Batch等)以及第三方开源框架所需要定义的各种Bean。 Spring B

面对未来,乘风破浪 1412

SpringBoot 整合 Activiti 因依赖冲突产生的异常

环境 SpringBoot:2.2.1.RELEASE Maven:3.6.1 java.version:1.8 开始配置的Activiti依赖 <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic&l...

yage124的博客 3791

Spring Boot 中 `@EnableConfigurationProperties` 注解

@EnableConfigurationProperties 是 Spring Boot 实现外部化配置的核心注解,通过与 @ConfigurationProperties 配合,能够高效地将配置文件中的属性绑定到 Java 对象,提升代码的可维护性和解耦性。其核心价值在于简化配置管理,避免硬编码,同时支持灵活的多环境配置策略。

小李同学的博客 2081

ConfigurationProperties和EnableConfigurationProperties

ConfigurationProperties、EnableConfigurationProperties

熊诗言的博客 2063

Springboot全局异常处理

springboot默认发生4xx错误时候,pc端响应的页面如下如果是移动端(手机端)将会响应json格式的数据,如下。

程序员一博 3938
上一篇: 程序员面试除了刷题,就真没别的可做了么?
下一篇: 设计模式7大原则——开闭&单一职责&里氏替换
架构文摘JGWZ
博客等级 码龄5年 8808粉丝 345原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值