当前位置: 首页 > news >正文

关于Spring Boot的自动配置

目录

1.@EnableAutoConfiguration注解

2.@SpringBootConfiguration注解

3.@Import注解

4.spring.factories

5.总结

(1)@EnableAutoConfiguration

(2)AutoConfigurationImportSelector

(3) SpringFactoriesLoader

(4)META-INF/spring.factories

(5) @Conditional相关注解

(6) 配置属性绑定

(7)自动配置类加载



在开始学习之前,先简单介绍几个关键组件:

1.@EnableAutoConfiguration注解

这是启动自动配置的主要注解,通常在主应用类上使用。它启用了Spring Boot的自动配置机制。通过这个注解,Spring Boot 可以根据所添加的依赖自动配置相应的 Beans。例如,如果类路径下有Mybatis的JAR包,MybatisAutoConfiguration注解就能根据相关参数来配置Mybatis的各个Spring Bean.

下面是一个简单的示例代码,展示了如何使用 @EnableAutoConfiguration 注解创建一个 Spring Boot 应用程序:

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

在这个示例中,@SpringBootApplication 是一个组合注解,其中包含了 @EnableAutoConfiguration。因此,当在类上使用 @SpringBootApplication 时,实际上就启用了自动配置。如果只想使用 @EnableAutoConfiguration,可以这样写:

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;@EnableAutoConfigurationpublic class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

在这个示例中,同样是启用了自动配置,但没有使用 @SpringBootApplication。需要注意的是:使用 @SpringBootApplication 还会启用其他的功能,例如组件扫描和配置属性。

2.@SpringBootConfiguration注解

用于指示一个类是 Spring Boot 应用的配置类。该注解实际上是@Configuration 的一个变体,并且它提供了一些额外的功能来支持 Spring Boot 的自动配置特性。

这个注解的主要作用是表明这个类是用来定义 Spring 应用上下文的 Bean 的,并且它通常用于作为 Spring Boot 应用程序的入口点。

代码示例:

import org.springframework.boot.SpringBootConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@SpringBootConfiguration
public class MyAppConfiguration {@Beanpublic MyBean myBean() {// 返回MyBean的一个实例return new MyBean();}
}

3.@Import注解

该注解是 Spring 框架中的一个重要特性,允许将其他配置类或普通类导入到当前配置类中,从而利用这些类作为 Spring 上下文的一部分。这通常用于将多个配置类组织在一起,以便在需要时进行管理。

示例代码;

示例 1:导入配置类

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Import;@Configuration@Import(OneConfiguration.class})public class MainConfiguration {@Beanpublic String mainBean() {return "Bean";}}@Configurationclass OneConfiguration {@Bean public String oneBean() {return "One Bean";}}

在此示例中,MainConfiguration 类通过 @Import 注解导入了 OneConfiguration 类,这样 OneConfiguration 中定义的 bean 也会被注册到 Spring 上下文中。

示例 2:导入普通类

import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Import;@Configuration@Import({UserService.class})public class BootConfig {@Beanpublic String bootBean() {return "Boot Bean";}}class UserService {public void do() {System.out.println("User Service");}}

4.spring.factories

是一个关键的配置文件,位于META-INF目录下。这个文件用于定义Spring Boot应用程序启动时需要加载的自动配置类。当Spring Boot应用程序启动时,@EnableAutoConfiguration注解触发自动配置,它会通过SpringFactoriesLoader类加载spring.factories文件中列出的所有自动配置类。

# 自定义自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ape.starter.MyAutoConfiguration
# 指定自动配置类,这些类将被Spring Boot的自动配置机制加载
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\
org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\
org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\
...

5.总结

Spring Boot的自动配置原理基于以下几个关键组件和步骤:

(1)@EnableAutoConfiguration

这个注解是自动配置的核心,它告诉Spring Boot根据类路径中的库和依赖来自动配置Spring应用。@EnableAutoConfiguration通过@Import引入AutoConfigurationImportSelector类,后者负责加载自动配置。

(2)AutoConfigurationImportSelector

AutoConfigurationImportSelector是一个DeferredImportSelector的实现,它会在Spring上下文的所有`@Configuration类加载完成后执行。它负责从spring.factories文件中读取自动配置类列表,并根据条件决定哪些配置类应该被加载。

(3) SpringFactoriesLoader

SpringFactoriesLoader是一个Spring框架的工具类,用于加载classpath下的`META-INF/spring.factories文件。这个文件包含了自动配置类列表,SpringFactoriesLoader`将这些类名解析为具体的类对象。

(4)META-INF/spring.factories

spring.factories文件位于每个Spring Boot自动配置模块的META-INF目录下。它定义了自动配置类,这些类是实现自动配置的Java配置类,通常使用@Configuration注解标注。

(5) @Conditional相关注解

自动配置类通常结合@Conditional相关注解使用,例如@ConditionalOnClass、@ConditionalOnBean、@ConditionalOnMissingBean、@ConditionalOnProperty等。这些条件注解控制配置类在何种条件下生效。

(6) 配置属性绑定

使用@ConfigurationProperties注解将配置文件中的属性绑定到Java Bean上,使得配置信息可以被Spring容器管理的Bean使用。

(7)自动配置类加载

Spring Boot启动时,会根据spring.factories文件中定义的自动配置类列表,结合条件注解的判断结果,动态地加载和注册Bean到Spring应用上下文中。


 

相关文章:

关于Spring Boot的自动配置

目录 1.EnableAutoConfiguration注解 2.SpringBootConfiguration注解 3.Import注解 4.spring.factories 5.总结 (1)EnableAutoConfiguration (2)AutoConfigurationImportSelector (3) SpringFactoriesLoade…...

## 已解决:`java.sql.SQLSyntaxErrorException: SQL语法错误` 异常的正确解决方法,亲测有效!!! ###

1. 问题描述 java.sql.SQLSyntaxErrorException 是 Java 程序在执行 SQL 查询时,因 SQL 语法错误而抛出的异常。通常情况下,错误信息会指示出错的 SQL 语句及错误原因,如拼写错误、关键字遗漏、字段名称错误等。 典型的错误信息如下&#x…...

备战秋招60天算法挑战,Day22

题目链接: https://leetcode.cn/problems/missing-number/ 视频题解: https://www.bilibili.com/video/BV1HS42197Hc/ LeetCode 268.丢失的数字 题目描述 给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组…...

在Linux下搭建go环境

下载go go官网:All releases - The Go Programming Language 我们可以吧压缩包下载到Windows上再传到Linux上,也可以直接web下载: wget https://golang.google.cn/dl/go1.23.0.linux-amd64.tar.gz 解压 使用命令解压: tar -x…...

738.单调递增的数字

738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 示例 1: 输入: n 10 输出: 9示例 2: 输入: n 1234 输…...

近年国际重大网络安全事件深度剖析:安全之路任重道远

引言 在当今数字化时代&#xff0c;网络安全已成为全球关注的焦点。随着信息技术的飞速发展&#xff0c;网络攻击的手段和规模也在不断升级&#xff0c;给个人、企业和国家带来了巨大的威胁。本文将盘点近年来国际上发生的重大网络安全事件&#xff0c;分析其影响和教训&#…...

Windows C++控制台菜单库开发与源码展示

Windows C控制台菜单库 声明&#xff1a;演示视频&#xff1a;一、前言二、具体框架三、源码展示console_screen_set.hframeconsole_screen_frame_base.hconsole_screen_frame_char.hconsole_screen_frame_wchar_t.hconsole_screen_frame.h menuconsole_screen_menu_base.hcons…...

ARM——驱动——Linux启动流程和Linux启动

一、flash存储器 lash存储器&#xff0c;全称为Flash EEPROM Memory&#xff0c;又名闪存&#xff0c;是一种长寿命的非易失性存储器。它能够在断电情况下保持所存储的数据信息&#xff0c;因此非常适合用于存储需要持久保存的数据。Flash存储器的数据删除不是以单个的字节为单…...

Docker和虚拟机的区别详细讲解

Docker 和虚拟机&#xff08;VM&#xff09;是现代 IT 基础设施中常见的技术&#xff0c;它们都用于在单一硬件上运行多个操作环境&#xff0c;但它们的工作原理、性能、资源利用和使用场景存在显著差异。以下是对 Docker 和虚拟机区别的详细讲解。 一、基础概念 1. Docker …...

leetcode_68. 文本左右对齐

68. 文本左右对齐 题目描述&#xff1a;给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff1b;也就是说&#xff0c…...

python探索分形和混沌

简单产生复杂&#xff0c;混沌孕育秩序 0. 引言 a. 分形 fractal 【也叫碎形】 分形是一种具有自相似性和复杂结构的几何图形。在分形结构中&#xff0c;无论放大多少次&#xff0c;局部的结构特征都与整体结构相似。这种特性在自然界中广泛存在&#xff0c;比如树木枝干、山…...

LeetCode77 组合

前言 题目&#xff1a; 77. 组合 文档&#xff1a; 代码随想录——组合 编程语言&#xff1a; C 解题状态&#xff1a; 没尝试出来 思路 经典的组合问题&#xff0c;可以考虑使用回溯法。使用回溯法时可以根据回溯法的模板来考虑如何解决。 代码 回溯法 class Solution { p…...

C#:Bitmap类使用方法—第1讲

首先看一下Bitmap定义&#xff1a;封装 GDI 位图&#xff0c;此位图由图形图像及其属性的像素数据组成。 Bitmap 是用于处理由像素数据定义的图像的对象。 下面介绍一下使用的例子&#xff1a; Bitmap image1; private void Button1_Click(System.Object sender, System.Eve…...

PaddleNLP 3.0 支持大语言模型开发

huggingface不支持模型并行。张量并行&#xff0c;不满足大规模预训练的需求。 1、组网部分 2、数据流 3、训练器 4、异步高效的模型存储...

32次8.21(学习playbook-roles,脚本创建数据库和表,mycat读写分离)

1.roles目录介绍 files&#xff1a;⽤来存放由copy模块或script模块调⽤的⽂件。 tasks&#xff1a;⾄少有⼀个main.yml⽂件&#xff0c;定义各tasks。 handlers:有⼀个main.yml⽂件&#xff0c;定义各handlers。 templates&#xff1a;⽤来存放jinjia2模板。 vars&#xff1a…...

I2C通信协议(软件I2C和硬件I2C)

相比于之前学的异步全双工且需要两条通信线的串口通信&#xff0c;I2C则为同步半双工&#xff0c;仅需要一条通信线&#xff0c;全双工与半双工区别如下&#xff1a; 全双工&#xff08;Full Duplex&#xff09;半双工&#xff08;Half Duplex&#xff09;数据传输方式同时双向…...

Linux入门——08 进程间通讯——管道

1.进程间通讯 1.1什么是通讯 进程具有独立性&#xff08;每个进程都有自己的PCB,独立地址空间&#xff0c;页表&#xff09;但是要进行进程的通信&#xff0c;通信的成本一定不低&#xff0c;打破了独立性 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给…...

深入探讨SD NAND的SD模式与SPI模式初始化

在嵌入式系统和存储解决方案中&#xff0c;SD NAND的广泛应用是显而易见的。CS创世推出的SD NAND支持SD模式和SPI模式&#xff0c;这两种模式在功能和实现上各有优劣。在本文中&#xff0c;我们将深入探讨这两种模式的初始化过程&#xff0c;并比较它们在不同应用场景下的优劣&…...

【jvm】栈和堆的区别

目录 1. 用途2. 线程共享性3. 内存分配和回收4. 生命周期5. 性能特点 1. 用途 1.堆&#xff1a;主要用于存储对象实例和数组。在Java中&#xff0c;所有通过new关键字创建的对象都会被分配到堆上。堆是一个大的内存池&#xff0c;用于存储所有的Java对象&#xff0c;包括实例变…...

智能的意义是降低世界的不确定性

世界充满着不确定性&#xff0c;而智能天生就追求一定的确定性&#xff0c;因为不确定性会危及智能的生存。智能本身是一种有序、相对确定的结构产生的&#xff0c;虽然也有一定的不确定性&#xff0c;而且这些不确定性有利于智能的进化&#xff0c;但是&#xff0c;相对而言&a…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...