关于Spring Boot的自动配置

embedded/2024/9/19 23:07:53/ 标签: spring boot, java, 后端

目录

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 应用程序:

java">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,可以这样写:

java">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 应用程序的入口点。

代码示例:

java">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:导入配置类

java">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:导入普通类

java">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文件中列出的所有自动配置类。

java"># 自定义自动配置类
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.ape.starter.MyAutoConfiguration
java"># 指定自动配置类,这些类将被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应用上下文中。


 


http://www.ppmy.cn/embedded/100739.html

相关文章

G1处理器GC调优常用参数详解

mixGC触发机制: G1 垃圾收集器在执行垃圾收集时,会根据不同的情况选择不同的垃圾收集策略,其中 "Mixed GC" 是一种比较复杂的策略,用于回收整个堆内存中的垃圾。 G1 垃圾收集器执行 Mixed GC 的时机通常取决于以下几个…

【Python进阶(十)】——Matplotlib基础可视化

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一|统计学|干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项,参与研究经费10w、40w级横向 文…

Java泛型机制详解

引入泛型的原因 泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。也就是说在泛型使用过程中,操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口…

一、HTML5知识点精讲

一、HTML5介绍 html是用来描述网页的一种语言(就是写网页的一种语言)。 它和CSS,JS称为网页三要素。 HTML负责把元素简单呈现在网页上,是网页的身体CSS负责给网页元素添加各种样式,是网页的衣服JS负责实现各种动态、…

ShellSweepPlus 介绍:开源 Web Shell 检测

ShellSweepPlus 概述 ShellSweepPlus是一款开源工具,旨在帮助安全团队检测潜在的 Web Shell。它是 ShellSweep 的增强版 Webshell 的威胁 Web shell 对组织构成重大威胁,因为它们为攻击者提供了对受感染 Web 服务器的未经授权的访问和控制。攻击者可以利用这些 shell 来:…

6.InnoDB引擎

InnoDB引擎 1.逻辑存储结构2.架构2.1内存架构2.2 磁盘结构 3.事务原理3.1 事务3.2 redo log3.3undo log 4.MVCC4.1MVCC 基本概率14.2 实现原理 1.逻辑存储结构 2.架构 2.1内存架构 2.2 磁盘结构 create tablespace mytest add datafile mytest.idb engineinnodb;后台线程 mys…

用 postman 的时候如何区分服务器还是自己的问题?

“首先,可以通过请求的目标地址来判断。如果目标地址是已知的服务器地址,那很可能是在与服务器进行交互。而如果目标地址指向本地的特定端口或 IP 地址,比如 127.0.0.1 或 localhost,那就可能是在测试本地的服务。 其次&#xff…

AD的3D模型格式是什么

AD通常指的是Altium Designer,这是一款用于电子设计自动化的软件,主要用于电路板的设计。在Altium Designer中,3D模型主要用于PCB(印制电路板)设计中的可视化,以便设计师能够在三维空间中查看组件和板的布局…

ES6笔记总结(Xmind格式):第三天

Xmind鸟瞰图: 简单文字总结: ES6知识总结: Promise的使用: 1.使用 new Promise() 构造函数来创建一个 promise 对象 2.接受两个函数作为参数:resolve 和 reject ①resolve 函数在异步操作成功完成时调用&#xf…

正则表达式——详解

正则表达式是什么? 正则表达式(Regular Expression,通常简写为 regex、regexp 或 RE)是一种强大的文本处理工具,用于描述一组字符串的模式。它可以用来匹配、查找、替换等操作,几乎所有现代编程语言都支持…

Web AI测试WINSCP从windows同步文件到Linux脚本使用案例-测试验证成功

Web AI测试脚本使用案例 提问: windows 使用winscp工具定时传输文件到Linux系统的/tmp目录 回答: option batch abort option confirm off open sftp://username:passwordhostname put "C:\path\to\your\local\file" /tmp/ exitecho off &…

stm32的UART重定向printf()

1配置好uart 2打开usart.c文件 3在此文件前面添加头文件 4在末尾添加重定向代码 添加的代码 /* USER CODE BEGIN 1 *///加入以下代码,支持printf函数,而不需要选择use MicroLIB //#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #if 1 //#pragma import(__use_n…

Java-Redis

文章目录 基础基础内容使用场景/功能常见数据类型下载与安装可视化(多个)发布订阅功能事务两种持久化主从模式哨兵模式集群模式Cluster缓存淘汰过期删除缓存一致 Cache Aside缓存击穿缓存穿透缓存雪崩分布式锁 实战内容配置文件配置Redis的BeanRedis为什…

js怎样改变元素的内容、属性、样式?

一、改变元素内容 使用 textContent 属性: textContent 可以设置或获取元素及其后代的文本内容。例如 const element document.getElementById(myElement);element.textContent New text content;使用 innerHTML 属性: innerHTML 可以设置或获取元素的…

C++ 模板

模版收尾 模版的声明和定义不能分离&#xff0c;否则会报错. 写下面三个文件&#xff1a; Stack.h#pragma once #include<iostream> using namespace std; template <class T> T Add(const T& left, const T& right);Stack.cpp#include"Stack.h&qu…

【git】如何更改git绑定账号

更换之前同事的git账号&#xff08;gitee仓库&#xff09; 1、公钥配置 公钥的作用&#xff1a;身份验证&#xff0c;免去每次提交或拉去的登录操作。步骤&#xff1a; 1.安装git --> 鼠标右键 --> Git Bash Here -->进入命令窗口 命令一&#xff1a;查看git配置 …

浏览器请求无缝导入apifox(无需客户端,在线使用)方法

不用下载客户端浏览器在线模拟请求&#xff0c;方便快捷&#xff01; 废话不多少&#xff0c;只需三步&#xff0c;往下看&#xff01; 一步&#xff1a; 打开F12 -> 网络 -> 找到你要模拟的请求&#xff0c;右键以cURL格式复制 二步&#xff1a; Apifox 访问Apifox的w…

ReadAgent,一款具有要点记忆的人工智能阅读代理

人工智能咨询培训老师叶梓 转载标明出处 现有的大模型&#xff08;LLMs&#xff09;在处理长文本时受限于固定的最大上下文长度&#xff0c;并且当输入文本越来越长时&#xff0c;性能往往会下降&#xff0c;即使在没有超出明确上下文窗口的情况下&#xff0c;LLMs 的性能也会随…

六. 部署分类器-deploy-classification-advanced

目录 前言0. 简述1. 案例运行2. 补充说明3. 代码分析3.1 main.cpp3.2 trt_worker.cpp3.3 trt_logger.cpp3.4 trt_classifier.cpp3.5 trt_model.cpp3.6 inference部分 结语下载链接参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》&#xff0c;链接。记录下个人学习…

EmguCV学习笔记 VB.Net 6.2 轮廓处理

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…