Spring Boot⾃动配置

一、Spring Boot的自动配置原理

Spring Boot使用一种称为“约定优于配置”的方法,这意味着如果你按照预定的方式来安排你的代码和依赖项,Spring Boot可以自动配置你的应用程序。主要特点包括:

  • 自动检测:Spring Boot在应用启动时会自动检测添加到项目中的jar依赖,并基于这些依赖尝试推断需要配置哪些Bean。例如,如果Spring Boot检测到classpath中包含Spring Web MVC(通过spring-webmvc jar),它会自动配置你的应用程序为一个web应用,注册必要的Controller、ViewResolver等Bean。
  • 自动配置:Spring Boot提供了大量的自动配置,这些配置尝试根据classpath下的库自动设置Spring应用。这包括内嵌服务器的配置、数据源、事务管理等。用户可以通过添加自定义属性来覆盖这些自动配置的默认设置

二、Spring Boot自动配置原理源码

SpringBoot的自动配置原理源码口是@SpringBootApplication注解,这个注解封装了3个注解

1.@SpringBootConfiguration
  • 描述:这是一个特化的@Configuration注解,它标记了一个类作为Spring Boot应用的配置类。@Configuration注解本身表明这个类可以使用Spring IoC容器作为bean定义的来源。
2. @ComponentScan
  • 作用:这个注解告诉Spring从哪里开始扫描组件,所以它会自动发现和注册Spring容器中的bean。默认情况下,它会扫描@SpringBootApplication所在的包及其子包中的所有类。
  • 用途:这允许开发者通过注解如@Component@Service@Repository@Controller等自动注册bean,无需显式书写bean的注册代码。
3. @EnableAutoConfiguration
  • 重要性:这是Spring Boot的自动配置魔法所在。该注解利用Spring的条件注解(如@Conditional)来自动配置bean,假设根据类路径下的jar依赖、已定义的bean以及各种属性设置,条件成立的话。
  • 实现机制
    • @Import注解:它导入AutoConfigurationImportSelector,这个选择器通过读取META-INF/spring.factories文件中的配置来自动选择配置类。这些配置类通常包括针对Spring Boot应用优化的自动配置类,这些类会配置如数据源、事务管理器、web配置等常见的功能。
    • @AutoConfigurationPackage:这个注解自动注册了配置类所在的包,这有助于确定需要自动配置的基本包。实际上,这个注解负责注册一个特殊的注册器,它会把主配置类(即@SpringBootApplication所在的类)所在的包注册到Spring IoC容器中。

这个流程使得Spring Boot应用可以几乎不需要任何显式配置就快速启动和运行。通过这些自动配置的能力,开发者可以将更多的精力集中在业务逻辑上,而非配置上,大大提高了开发效率和应用的启动速度。这种设计也是Spring Boot广受欢迎的重要原因之一

三、如何覆盖默认的自动配置

虽然自动配置大大简化了应用的配置工作,但有时候你可能需要修改默认的行为或覆盖自动配置的一部分。你可以通过以下方式做到这一点:

  • 指定属性:在application.propertiesapplication.yml中指定不同的属性值。
  • 添加自定义@Configuration:自定义配置类可以定义额外的bean或使用@Primary注解覆盖自动配置的bean。
    • 你可以在你的启动类上使用@ComponentScan注解来指定Spring Boot扫描其他包。例如,如果你的启动类在com.example.demo包中,而你想加载com.bite.autoconfig包中的配置,你可以这样做:
      package com.example.demo;import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.context.annotation.ComponentScan;@SpringBootApplication
      @ComponentScan(basePackages = {"com.example.demo", "com.bite.autoconfig"})
      public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
      }
      
  • 使用@Import注解:直接在你的配置类上使用@Import来导入特定的配置类,这将覆盖自动配置。
    • 如果你知道具体的配置类,可以直接在启动类或任何配置类上使用@Import来显式地导入配置。这适用于需要导入具体配置类的场景:
      package com.example.demo;import org.springframework.boot.autoconfigure.SpringBootApplication;
      import org.springframework.context.annotation.Import;
      import com.bite.autoconfig.BiteConfig;@SpringBootApplication
      @Import(BiteConfig.class)
      public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
      }
      
  • 使用@SpringBootApplicationscanBasePackages
    • @SpringBootApplication注解本身包含了@ComponentScan的功能。因此,你也可以直接在这个注解中指定要扫描的包:
package com.example.demo;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = {"com.example.demo", "com.bite.autoconfig"})
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
  • 处理第三方JAR包
    • 对于第三方JAR包中的Bean,如果它们不是通过Spring的方式配置(比如使用Spring Boot的自动配置),你可能需要创建自己的配置类来实例化这些Bean。例如,如果一个第三方库提供了一个服务,你可以创建一个配置类,在那里创建一个Bean实例:
      package com.example.demo.config;import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Configuration;
      import third.party.LibraryClass;@Configuration
      public class ThirdPartyConfig {@Beanpublic LibraryClass libraryClass() {return new LibraryClass();}
      }
      

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

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

相关文章

C#实现word和pdf格式互转

1、word转pdf 使用nuget: Microsoft.Office.Interop.Word winform页面: 后端代码: //using Spire.Doc; //using Spire.Pdf; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using Sy…

iOS Swift5算法恢复——HMAC

demangle的时候看到了CryptoSwift,HMAC,于是写一个helloworld,用于对照。 sudo gem install cocoapods pod init pods文件,注意要标注静态链接: # Uncomment the next line to define a global platform for your p…

Diving into the HAL-----HAL_GPIO

1、怎么看待外设: 从总线连接的角度看,外设和Core、DMA通过总线交换数据,正所谓要想富先修路。要注意,这些总线中的每一个都连接到不同的时钟源,这些时钟源决定了连接到该总线的外设操作的最大速度。 从内存分配的角度…

C#与C++交互开发系列(十六):使用多线程

前言 在开发需要高性能的应用程序时,多线程是提升处理效率和响应速度的关键技术。C 和 C# 各自拥有不同的线程模型和并发工具。在跨语言开发中,如何有效地利用两者的并发特性,同时确保线程安全和数据一致性,是一个值得探讨的问题…

libavdevice.so.58: cannot open shared object file: No such file ordirectory踩坑

博主是将大图切分成小图时遇到 问题一、linux编译后,找不到ffmpeg中的一个文件 产生原因,各种包集成,然后安装以后乱七八糟,甚至官方的教程也不规范导致没有添加路径到系统文件导致系统执行的时候找不到 1.下载 博主进行的离线…

查询使用方法:

模糊查询: 查询某一列中内容为空的记录。 -- 模糊查询 (项目中尽量不要使用) -- 张x SELECT * FROM student WHERE student_name LIKE 张_; -- % 不限长度的字符 -- 手机号中有 23 0或多个 SELECT * FROM student WHERE phone LIKE %23% -- 名字包含铮的学生 SELEC…

数据结构与算法分析——你真的理解查找算法吗——基于散列的查找(代码详解+万字长文)

一、算法描述 前面讨论的查找算法在处理小数据量(顺序查找)或者有序的数据集合(二分查找)时才使用。我们需要更加强大的算法能够查找较大的集合,而且并不需要有序。最常使用的一个方法是使用散列函数来将目标元素的一个或者多个特征转换成一个值,这个值用来索引一个已经索引的…

密码管理工具实现

该文档详细描述了实现一个简单的密码管理工具的过程,工具基于PHP和MySQL构建,支持用户注册、密码存储、管理以及角色权限控制等核心功能。 系统架构设计 技术栈:PHP(后端逻辑)、MySQL(数据存储&#xff09…

深度学习(七)深度强化学习:融合创新的智能之路(7/10)

一、深度强化学习的崛起 深度强化学习在人工智能领域的重要地位 深度强化学习作为一种融合了深度学习和强化学习的新技术,在人工智能领域占据着至关重要的地位。它结合了深度学习强大的感知能力和强化学习优秀的决策能力,能够处理复杂的任务和环境。例如…

基于 Java 的 Spring Boot 和 Vue 的宠物领养系统设计与实现

需要代码 vx:Java980320 不收取任何费用 在这个宠物领养系统中,我们可以设定两个角色:管理员和普通用户。每个角色的功能和目标略有不同,以下分别介绍: 管理员 管理员的主要职责是确保平台的高效运行&#xff0c…

PythonBase01

将理论,代码,图示三合一。 day1计算机基础结构 硬件 1944年,美籍匈牙利数学家冯诺依曼提出计算机基本结构。 五大组成部分:运算器、控制器、存储器、输入设备、输出设备。 – 运算器:按照程序中的指令&#xff0c…

APISQL企业版离线部署教程

针对政务、国企、医院、军工等内网物理隔离的客户,有时需要多次摆渡才能到达要安装软件的服务器。本教程将指导您使用Linux和Docker Compose编排服务,实现APISQL的离线部署。 准备 准备一台Linux(x86_64)服务器。 安装Docker Engine(推荐版本…

【01初识】-初识 RabbitMQ

目录 学习背景1- 初识 MQ1-1 同步调用什么是同步调用?小结:同步调用优缺点 1-2 异步调用什么是异步调用?小结:异步调用的优缺点,什么时候使用异步调用? 1-3 MQ 技术选型 学习背景 异步通讯的特点&#xff…

记录一次mmpretrain训练数据并转onnx推理

目录 1.前言 2.代码 3.数据形态【分类用】 4.配置文件 5.训练 6.测试-分析-混淆矩阵等等,测试图片效果等 7.导出onnx 8.onnx推理 9.docker环境简单补充 1.前言 好久没有做图像分类了,于是想用商汤的mmclassification快速搞一波,发现已…

【微服务】Nacos 注册中心

<!-- nacos 依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${nacos.version}</version><type>pom</type><scope>import&l…

太速科技-430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡

430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡 一、板卡概述 板卡使用Xilinx的第三代RFSOC系列&#xff0c;单颗芯片包含8路ADC和DAC&#xff0c;64-bit Cortex A53系列4核CPU&#xff0c;Cortex-R5F实时处理核&#xff0c;以及大容量FPGA。 对主机接口采用PCIe Gen3x…

大文件秒传,分片上传,断点续传

大文件分片上传 一 功能描述 1.文件通过web端分片多线程上传到服务端&#xff0c;然后web端发起分片合并&#xff0c;完成大文件分片上传功能 2.上传过的大文件&#xff0c;实现秒传 3.上传过程中&#xff0c;服务异常退出&#xff0c;实现断点续传 二 流程图 三 代码运行…

数据库数据恢复—Oracle ASM磁盘组掉线 ,ASM实例无法挂载的数据恢复案例

Oracle数据库数据恢复环境&故障&#xff1a; Oracle ASM磁盘组由4块磁盘组成。Oracle ASM磁盘组掉线 &#xff0c;ASM实例不能mount。 Oracle数据库故障分析&恢复方案&#xff1a; 数据库数据恢复工程师对组成ASM磁盘组的磁盘进行分析。对ASM元数据进行分析发现ASM存储…

【HarmonyOS】判断应用是否已安装

【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全&#xff0c;只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法&#xff0c;即&#xff1a;canOpenLink。 使用该工具函数的前提是&#xff0c;本应用配置了查询标签querySch…

深度学习Pytorch-Tensor的属性、算术运算

深度学习Pytorch-Tensor的属性、算术运算 Tensor的属性Tensor的算术运算Pytorch中的in-place操作Pytorch中的广播机制Tensor的取整/取余运算Tensor的比较运算Tensor的取前k个大/前k小/第k小的数值及其索引Tensor判定是否为finite/inf/nan Tensor的属性 每一个Tensor对象都有以…