深入理解Spring Boot的自动配置

news2025/7/21 2:39:31

通过spring boot可以很方便的独立运行spring应用程序,因为spring boot内嵌了Tomcat、Jetty等servlet容器,切提供自动配置功能,无需进行XML配置即可自动运行应用程序。那么Spring boot启动过程中具体进行了哪些操作呢?下面是Spring Boot启动过程中执行的步骤

1.加载 Spring Boot 核心配置:在启动过程中,Spring Boot会加载并解析一系列核心配置文件,例如 application.properties/application.yml、application-{profile}.properties/application-{profile}.yml 等。在这些配置文件中,可以配置一些应用程序所需的基本配置,例如端口号、数据库连接信息、日志级别等。

2.加载 Spring 容器:Spring Boot 是基于 Spring框架的,因此在启动过程中,需要加载 Spring 容器,来管理应用程序中的各种 Bean。

3.自动配置:Spring Boot 中提供了大量的 Starter 依赖,它们会自动配置相应的 Bean,并将其注入到 Spring 容器中。例如,如果应用程序中需要使用 Spring Data JPA 来访问数据库,只需要添加 spring-boot-starter-data-jpa 依赖,Spring Boot 就会自动配置数据源、事务管理器等相关 Bean。

4.启动 Embedded Web 容器:Spring Boot 支持内嵌式的 Web 容器,例如 Tomcat、Jetty 和 Undertow。启动过程中,会根据应用程序的类型自动选择适合的 Web 容器,并将其启动。在 Web 容器启动之前,Spring Boot 会将应用程序中所有的 Web 相关的 Bean 注入到容器中,例如 Controller、Filter、Listener 等。

5.注册 ServletContextListener:在启动 Web 容器后,Spring Boot 会自动注册一个 ServletContextListener,用于启动 Spring MVC 框架,并将其注入到 Web 容器中。

6.启动 Spring MVC 框架:Spring MVC 框架是一个 Web 框架,它负责处理 HTTP 请求和响应,并将它们转换为 Java 对象。在 Spring Boot 启动过程中,Spring MVC 框架会被启动,并将所有的 Controller、ViewResolver 等相关的 Bean 注入到 Spring 容器中。

在上述Spring Boot启动过程中,究竟会进行哪些自动配置呢?Spring boot进行的自动配置分类总结如下所示:

  1. Spring Framework 配置:Spring Boot 会自动配置 Spring Framework 相关的组件,如 Spring MVC、Spring Data、Spring Security 等。

  1. Web 应用配置:Spring Boot 会自动配置 Tomcat、Jetty、Undertow 等 Web 容器,以及 Web 应用的相关组件,如 Servlet、Filter、Listener 等。

  1. 数据源配置:Spring Boot 会根据应用程序所使用的数据库自动配置数据源,支持主流的关系型数据库和 NoSQL 数据库。

  1. 缓存配置:Spring Boot 会根据应用程序的需求自动配置缓存,支持主流的缓存系统,如 Ehcache、Redis、Hazelcast 等。

  1. 日志配置:Spring Boot 会自动配置 Logback、Log4j2 等日志框架,并提供了统一的日志输出格式。

  1. 健康检查配置:Spring Boot 会自动配置 Actuator,提供了健康检查、监控和管理等功能,可帮助开发者更好地了解和管理应用程序。

  1. 配置文件加载:Spring Boot 会根据应用程序的环境自动加载配置文件,支持多种配置文件格式,如 YAML、Properties 等。

  1. 自动化测试配置:Spring Boot 会自动配置 JUnit、Mockito 等测试框架,以及 TestRestTemplate、MockMvc 等测试工具,可帮助开发者更方便地编写和运行测试用例。

上面知识对Spring boot的配置进行了大致的分类,在启动程序时,如果要查看具体进行了哪些配置,那么在启动类配置上开启Debug配置,启动应用程序,在日志中会打印所有的自动化配置,如下所示:可以看到自动配置分为三类,第一类:条件匹配类配置类,即一定条件满足后才会进行的自动配置,第二类:Unconditional classes,即无任何条件一定会进行自动化配置的类,第三类:Exclusions,可以在编写代码时通过注解将某些自动化配置类进行排除。下面是排除了三个数据库相关的自动配置类。

上面提到了条件注解,常用的条件注解以及含义如下所示,这些条件注解可以与其他的Spring注解一起使用,例如@Service、@Configuration、@Bean等,这个可以灵活地控制Bean的创建和配置。

  1. @ConditionalOnBean:当容器中存在指定Bean时才会生效。

  1. @ConditionalOnMissingBean:当容器中不存在指定Bean时才会生效。

  1. @ConditionalOnClass:当类路径下存在指定的类时才会生效。

  1. @ConditionalOnMissingClass:当类路径下不存在指定的类时才会生效。

  1. @ConditionalOnProperty:当指定的配置属性被设置为指定的值时才会生效。

  1. @ConditionalOnExpression:当指定的表达式结果为true时才会生效。

上面都是一些概念介绍,接下来可以看看在spring boot中是如何实现内置数据库的自动化配置的。在IDE工具中查看DataSourceAutoConfiguration.class文件,可以看到在该class上有条件注解,在EmbeddedDatabaseConfiguration()方法上也存在条件注解,即当DataSource这个class不存在时,那么该配置会生效,所以,当没有在配置文件上配置数据库相关信息,例如mysql等时,就会默认使用内置数据库,可以看到自动配置过程中使用了大量的条件注解。

接下来,通过一个实际的Demo例子来理解自动配置的过程,初始化两个项目,项目一主要有一个GreetingApplicationRunner这个类,项目二主要有GreetingAutoConfiguration类,切项目二中在properties文件中讲启动类添加到EnableAutoConfiguration配置下,这样这个配置类才会进行自动配置。在项目二的配置类中,可以看到也使用了条件注解,即项目中存在GreetingApplicationRunner这个类(也就是项目一创建的类)时,配置类GreetingAutoConfiguration的逻辑才生效。在该配置类下,创建了Bean,这个Bean的创建也使用了条件注解,即当GreetingApplicationRunner这个class缺失的情况下,且配置文件中greeting.enabled这个配置项为true的情况下,会自动化生成GreetingApplicationRunner这个Bean,创建的这个Bean构造函数中的参数为空。

接着创建项目三,在项目三的pom.xml文件中引入上面的两个项目配置,在IDE工具中如果引入Module的方式,引入上面创建的两个项目的pom.xml文件。项目三的pom.xml文件如下所示,IDE引入Module的过程如下图所示:

在引入Module后,在项目三上启动应用程序,第一种启动方式是:greeting.enabled=true,@Bean下面的代码注释掉,执行程序可以看到初始化了GreetingApplicationRunner这个class,打印的信息是"we all like default",说明是自动配置生成的bean,第二种启动方式是:greeting.enabled=true,@Bean下面的代码取消注释,执行程序后,打印的信息是“We all like spring”,说明是@Bean创建的GreetingApplicationRunner这个class,第三种启动方式是:greeting.enabled=false,注释掉@Bean下面的代码,可以看到没有打印任何信息,即没有创建GreetingApplicationRunner这个class。

以上就是自动配置的演示Demo,该Demo来自极客时间专栏,详细信息可下载Demo运行。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/368629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Julia 数学函数

Julia 提供了一套高效、可移植的标准数学函数。 数值比较 下表列出了用于数值比较的函数: 函数测试是否满足如下性质isequal(x, y)x 与 y 值与类型是否完全相同isfinite(x)x 是否是有限大的数字isinf(x)x 是否是(正/负)无穷大isnan(x)x 是否…

项目重构,从零开始搭建一套新的后台管理系统

背景 应公司发展需求,我决定重构公司的后台管理系统,从提出需求建议到现在的实施,期间花了将近半个月的时间,决定把这些都记录下来。 之前的后台管理系统实在是为了实现功能而实现的,没有考虑到后期的扩展性&#xf…

SpringMVC常见面试题(2023最新)

目录前言1.简单介绍下你对springMVC的理解?2.说一说SpringMVC的重要组件及其作用3.SpringMVC的工作原理或流程4.SpringMVC的优点5.SpringMVC常用注解6.SpringMVC和struts2的区别7.怎么实现SpringMVC拦截器8.SpringMvc的控制器是不是单例模式?如果是,有什…

关基系统三月重保安全监测怎么做?ScanV提供纯干货!

三月重保当前,以政府、大型国企央企、能源、金融等重要行业和领域为代表的关键信息基础设施运营单位都将迎来“网络安全大考”。 对重要关基系统进行安全风险监测并收敛暴露面,响应监管要求进行安全加固,重保期间实时安全监测与数据汇报等具体…

js函数声明方式*2,对象声明方式*7,不同的调用

目录 一、两种函数声明方式 二、七种对象声明方式 一、两种函数声明方式 【1】命名函数 形如: function fu1(){ let firstName 111111111 let lastName 2222222 console.log(firstName ,lastName ) } function fu2(firstName,lastName ){ …

Linux 线程优先级

目录标题概述Linux进程调度的三种策略Linux 线程优先级对于实时任务对于普通任务top中的PR和NI其他说明代码示例设置为实时进程优先级测试代码概述 概述内容 常见的运用场景: 1:2;3; Linux进程调度的三种策略 SCHED_OTHER,分时调度策略&#…

【读论文】AttentionFGAN

【读论文】AttentionFGAN介绍网络架构提取红外图像目标信息的网络辨别器损失函数生成器损失函数辨别器损失函数总结参考论文: https://ieeexplore.ieee.org/document/9103116/如有侵权请联系博主介绍 好久没有读过使用GAN来实现图像融合的论文了,正好看…

【Java面试八股文宝典之基础篇】备战2023 查缺补漏 你越早准备 越早成功!!!——Day14

大家好,我是陶然同学,软件工程大三今年实习。认识我的朋友们知道,我是科班出身,学的还行,但是对面试掌握不够,所以我将用这100多天更新Java面试题🙃🙃。 不敢苟同,相信大…

计算机专业要考什么证书?

大家好,我是良许。 从去年 12 月开始,我已经在视频号、抖音等主流视频平台上连续更新视频到现在,并得到了不错的评价。 视频 100% 原创录制,绝非垃圾搬运号,每个视频都花了很多时间精力用心制作,欢迎大家…

Android高仿陌陌应用点点滑动效果

效果图:分析:从效果上看图片的展示具有层次感,在数据结构上更像是stack,所以通过继承FrameLayout来实现(不清楚FrameLayout布局特点的可以先百度下哈),外面是通过继承FrameLayout自定义的TinderStackLayout&#xff0c…

SpringBoot-基础篇

SpringBoot基础篇 ​ 在基础篇中,我给学习者的定位是先上手,能够使用SpringBoot搭建基于SpringBoot的web项目开发,所以内容设置较少,主要包含如下内容: SpringBoot快速入门SpringBoot基础配置基于SpringBoot整合SSMP…

为你的Vue2.x老项目安装Vite发动机吧

天下苦webpack久矣,相信作为前端开发者一定经历过在项目迭代时间较长的时候经历漫长等待的这一过程,每一次保存都会浪费掉大量时间,这是webpack这种机制所带来的问题。 于是,尤大为我们带来了新一代前端构建工具:vite…

搜索旋转排序数组、路径总和 II、拆分数字

文章目录搜索旋转排序数组(数组、二分查找)路径总和 II(树、深度优先搜索)拆分数字(算法)搜索旋转排序数组(数组、二分查找) 整数数组 nums 按升序排列,数组中的值 互不…

Transformer学习笔记

Transformer学习笔记1. 参考2. 模型图3.encoder部分3.1 Positional Encoding3.2 Muti-Head Attention3.3 ADD--残差连接3.4 Norm标准化3.5 单个Transformer Encoder流程图4.decoder部分4.1 mask Muti-Head Attention4.2 Muti-Head Attention5 多个Transformer Encoder和多个Tra…

详解数据库基本概念

数据库(DataBase 简称 DB):是一个长期存储在计算机内的、有组织的、可共享的、统一管理的大量数据的集合数据库管理系统(DataBase Management System 简称 DBMS):是一种操纵和管理数据库的大型软件&#xf…

基于嵌入式linux的DHCP服务器的搭建与移植(udhcp)

DHCP是Dynamic Host Configuration Protocol的缩写,即动态主机配置协议。DHCP是一个很重要的局域网的网络协议,使用UDP协议实现动态配置功能,主要有以下用途: 1、为内部网络或网络服务供应商自动分配IP地址; 2、为用…

利用Python和Sprak求曲线与X轴上方的面积

有n组标本(1, 2, 3, 4), 每组由m个( , , ...)元素( , )组成(m值不定), . 各组样本的分布 曲线如下图所示. 通过程序近似实现各曲线与oc, cd直线围成的⾯积. 思路 可以将图像分成若干个梯形,每个梯形的底边长为(Xn1 - Xn-1),面积为矩形的一半&#xff0c…

原创壁纸小程序独立后台(1.3.5版本介绍)

1、新版本开发目的 历经前两次版本迭代,本人发现在整个系统的架构方面存在一定的缺陷,这种缺陷就是前后端不分离,导致在后期的维护方面遇到了很多问题。 那么这次版本更新并没有带来很多新的功能,而是重构了系统并优化UI&#x…

【PyQt5图形界面编程(2)】:创建工程

创建工程 一、创建工程二、开始开发1、运行Qt5Designer,创建QT窗口2、运行pyUIC,转换xx.ui成xx.py3、main.py中引用xx.py中的类4、打包main.py成main.exe来发布5、执行终端报警处理方法三、其他(如果涉及)1、配置环境变量一、创建工程 采用虚拟环境来创建工程 相关的paka…

STM32FreeRTOS - 按键实现任务挂起和恢复

STM32f103C8T6 FreeRTOS - 按键实现任务挂起和恢复,按键按下时,LED任务执行,led闪烁,当led任务挂起,Led停止闪烁。1.STM32CubeMX 创建任务1.1配置GPIO按键配置外部中断触发GPIO绿灯,红灯配置输出模式1.2配置…