springboot的自动配置原理

devtools/2024/9/20 4:05:52/ 标签: spring boot, java, spring

一、自动配置的原理

Spring Boot 的自动配置原理主要基于以下几个核心概念和步骤:
1. 条件注解 (Conditional Annotations):Spring Boot 使用  @Conditional  系列注解来决定是否加载某个配置类或 Bean。这些注解包括但不限于:
 @ConditionalOnClass :当类路径上存在指定的类时,才会加载配置。
 @ConditionalOnMissingBean :当容器中不存在指定的 Bean 时,才会创建该 Bean。
 @ConditionalOnProperty :当指定的配置属性存在并符合预期时,才会加载配置。
2. 自动配置类 (Auto-configuration Classes):这些类负责提供默认的配置,它们通过  META-INF/spring.factories  文件被Spring Boot自动加载。
3. 配置属性 (Configuration Properties):通过外部化配置(如  application.properties  或  application.yml  文件),可以控制自动配置的行为。
4. 实现机制:
启用自动配置:在Spring Boot应用的主类上添加  @SpringBootApplication  注解,这个注解内部包含了  @EnableAutoConfiguration ,从而开启自动配置功能。
加载自动配置类:Spring Boot 在启动时会扫描  META-INF/spring.factories  文件,查找所有自动配置类。
条件注解的评估:Spring Boot 根据条件注解来决定是否加载对应的配置类或 Bean。
5. 自定义自动配置:开发者可以创建自己的自动配置类,并通过在  META-INF/spring.factories  文件中注册来让 Spring Boot 加载。

二、自动配置的实现机制

二、自动配置的实现机制
Spring Boot 通过以下步骤实现自动配置:

启用自动配置:在主类上添加 @SpringBootApplication 注解,该注解包含 @EnableAutoConfiguration,开启自动配置功能。
加载自动配置类:Spring Boot 在启动时会扫描 META-INF/spring.factories 文件,找到所有自动配置类。
条件注解的评估:根据条件注解(如 @ConditionalOnClass、@ConditionalOnMissingBean 等),决定是否加载对应的配置类或 Bean。

三、自动配置示例

接下来,我们通过具体的代码示例来展示 Spring Boot 自动配置的工作原理。

1. 创建 Spring Boot 项目

首先,创建一个简单的 Spring Boot 项目。在 pom.xml 文件中添加必要的依赖:
 

 <dependencies><!--引入自定义的redis-spring-boot-autoconfigure--><dependency><groupId>com.apesource</groupId><artifactId>redis-spring-boot-autoconfigure</artifactId><version>0.0.1-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--        <dependency>--><!--            <groupId>org.springframework.boot</groupId>--><!--            <artifactId>spring-boot-starter-test</artifactId>--><!--            <scope>test</scope>--><!--        </dependency>-->
</dependencies>

2. 主类和基本配置

创建一个主类,并添加 @SpringBootApplication 注解:

@SpringBootApplication
public class SpringbootStarter04Application {@GetMapping("/test")public static void main(String[] args) {ConfigurableApplicationContext context =SpringApplication.run(SpringbootStarter04Application.class, args);Jedis bean1 = context.getBean(Jedis.class);System.out.println(bean1);}
}

3. 自动配置类示例

为了展示自动配置的原理,我们自定义一个自动配置类。假设我们要自动配置一个自定义服务 MyService。

首先,创建RedisAutoconfigration 类:

@Configuration
@EnableConfigurationProperties(RedisProperties.class)
public class RedisAutoconfiguration {//注入jedis@Beanpublic Jedis jedis(RedisProperties redisProperties){return new Jedis(redisProperties.getHost(),redisProperties.getPort());}
}

在 resources/META-INF/spring.factories 文件中注册自动配置类:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.apesource.redisspringbootautoconfigure.RedisAutoconfiguration

4. 使用自定义自动配置

在 Spring Boot 应用中,我们可以直接注入 RedisAutoconfigration 并使用它:

@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {private String host="localhost";private int port=6379;public String getHost() {return host;}public void setHost(String host) {this.host = host;}public int getPort() {return port;}public void setPort(int port) {this.port = port;}
}

启动应用程序,访问 http://localhost:6379/test,可以看到控制台输出 Bean1的地址。


http://www.ppmy.cn/devtools/96914.html

相关文章

机器学习中的多模态学习

多模态学习(MultiModal Machine Learning,MMML)是一种结合多种不同类型或模态的数据和信息进行统一建模和分析的学习方法。其核心目标是通过机器学习的方法实现对多源模态信息的处理和理解。 多模态学习的基本概念与定义 多模态学习可以涵盖各种不同的数据类型,如图像、文…

ESP32CAM人工智能教学18

ESP32CAM人工智能教学18 获取数据并显示 如果我们给ESP32Cam外挂一些传感器&#xff08;比如温湿度传感器、超声波测距传感器、红外人体传感器等&#xff09;&#xff0c;我们怎么把ESP32Cam捕获到的数据&#xff0c;传递到客户端的浏览器&#xff0c;并在网页index.html中显示…

Redis非关系型数据库

Redis是什么 Redis&#xff1a;REmote DIctionary Server&#xff08;远程字典服务器&#xff09; 是完全开源免费的&#xff0c;用C语言编写的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的&#xff08;Key/Value&#xff09;分布式内存数据 库&#xff0c;基于内存运行…

react18 + ts 使用video.js 直播.m3u8格式的视频流

一、安装依赖 我使用的video.js版本是8.17.3&#xff0c;从 Video.js 7.x 开始&#xff0c;HLS 支持被内置到了 Video.js 中所以不需要安装其他依赖 npm i video.js 二、创建VideoPlayer组件 import React, { useEffect, useRef } from react import videojs from video.js …

使用Webstorm进行高效的全栈JavaScript开发

使用WebStorm进行高效的全栈JavaScript开发是一个很好的选择&#xff0c;因为WebStorm是JetBrains出品的一款功能强大的IDE&#xff0c;专为前端和后端开发者设计&#xff0c;支持JavaScript、TypeScript、Node.js、React、Vue.js、Angular等多种技术栈。以下是一些建议&#x…

Linux软件编程day(12) -udp

任务&#xff1a; 1.利用套接字实现两台主机全双工通信 socket socket bind 发一次数据(数据可以随便) 接收一次数据(目的&#xff1a;接收发送方的IPPort) 两个任务 …

saas服务,对同一个功能,需要使用不同客户的接口。那么哪种设计模式可以解决我的问题?

Q: 我现在遇到的问题&#xff1a;我在做一个saas服务&#xff0c;现在面对多家客户。对同一个功能&#xff0c;需要使用不同客户的接口。比如&#xff0c;我的发送短信功能&#xff0c;每个客户的发消息接口都不同。那么哪种设计模式可以解决我的问题&#xff0c;可以使用c#来给…

Redis:缓存击穿,缓存穿透,缓存雪崩

缓存穿透 缓存和数据库中都没有的数据&#xff0c;可用户还是源源不断的发起请求&#xff0c;导致每次请求都会到数据库&#xff0c;从而压垮数据库。 这将导致这个不存在的数据每次请求都要到存储层去查询&#xff0c;失去了缓存的意义。 *** 解决方案** 对空值进行缓存标…

应急响应:挖矿木马-实战 案例一.【Linux 系统-排查和删除】

什么是挖矿木马 挖矿木马是一种恶意软件&#xff0c;它在未经用户许可的情况下&#xff0c;利用用户的计算资源来挖掘加密货币&#xff0c;从而为攻击者带来非法收益。这类软件通常通过多种手段传播&#xff0c;例如利用系统漏洞、弱密码爆破、伪装正常软件等方法感染目标设备…

【CTF | WEB】003、攻防世界WEB题目之xff_referer

文章目录 xff_referer题目描述:解题思路&#xff1a;XFF与Referer基本了解1. XFF&#xff08;X-Forwarded-For&#xff09;&#xff1a;2. Referer&#xff1a;简单总结&#xff1a; 解题实操&#xff1a; xff_referer 题目描述: X老师告诉小宁其实xff和referer是可以伪造的。…

Springboot-从服务器获取一个输入流,转成视频文件存到oss

要在Spring Boot应用中从服务器获取一个输入流,然后将该流转换为视频文件并存储到阿里云 OSS中,你可以遵循以下步骤: 设置阿里云OSS客户端:首先,你需要配置阿里云OSS客户端,以便能够上传文件到OSS。 获取输入流:使用HTTP客户端(如RestTemplate或WebClient)从服务器…

c语言通过逻辑运算符和if语句制作招聘筛选程序

c语言里逻辑运算符 && 逻辑与 a&&b || 逻辑或 a||b ! 逻辑非 逻辑运算符计算结果是true和false,其中用1表示true,0表示false 这里要制作一个招聘筛选程序&#xff0c;要求年龄大于等于25&#xff0c;身高不低于1米7 代码如下 #include<s…

4.4、配置交换机vlan

一、配置前的碎碎恋 前面大致了解了二层交换机的一些缺点&#xff0c;还有什么是vlan&#xff0c;不同vlan之间的通信。 接下来看看配置交换机vlan用到哪些命令&#xff1a; 1.进入全局配置模式 Switch> enable Switch# configure terminal Switch(config)# 2. 创建VLAN…

结合GPT与Python实现端口检测工具(含多线程)

端口检测器是一个非常实用的网络工具&#xff0c;它主要用于检测服务器或本地计算机上的特定端口是否处于开放状态。通过这个工具&#xff0c;你可以快速识别和诊断网络连接问题&#xff0c;确保关键服务的端口能够正常接收和处理数据。这对于网络管理员和开发者来说是一个不可…

【PGCCC】使用 Postgres 递归 CTE 进行图形检索

您是否知道可以将 Postgres 用作某些用例的图形数据库&#xff1f; 假设您有如下图表&#xff1a; 我们可以在 NetworkX 中构建此图&#xff1a; 1import networkx as nx23G nx.Graph()45G.add_edges_from([6 ("A", "B"),7 ("A", "…

Windows 环境下 Go 语言使用第三方压缩包 gozstd 的报错处理

该文章主要记录在windows平台用go语言使用gozstd包时&#xff0c;遇到的错误及处理过程&#xff08;踩坑之旅&#xff09;&#xff01; 一、gozstd简介 gozstd是一个针对Zstandard&#xff08;简称Zstd&#xff09;的Go语言包装器&#xff0c;它提供了简单且高效的API&#xf…

从0开发一个 组件/插件 并部署

从零开始发布一个 Vue3 Vite 的 npm 包 1. npm账号配置 1.1 注册新账号 注册地址&#xff1a; www.npmjs.com/signup 1.2 登录账号 在命令行输入&#xff1a; npm login&#xff0c;此时会提醒你打开浏览器进行登录&#xff0c;然后邮件接收验证码&#xff0c;输入登录 …

在PHP中使用file_get_contents提取JSON值

在PHP开发中&#xff0c;我们经常需要处理各种数据格式&#xff0c;其中JSON是一种非常常见的数据交换格式。有时候&#xff0c;我们需要从网络上的某个URL获取JSON格式的数据&#xff0c;并提取其中的值。本文将介绍如何使用file_get_contents函数在PHP中获取并解析JSON数据。…

MT6761 快充同步

MT6761 是反激式电源的高性能60V同步整流器。MT6761兼容各种反激转换器类型。支持 DCM、CCM 和准谐振模式。MT6761集成了一个60V功率MOSFET&#xff0c;可以取代肖特基二极管&#xff0c;提高效率。V SW <V TH-ON 时&#xff0c;MT6761内部 MOSFET 导通。V SW >V TH-OFF …

贪心算法3

134. 加油站 全局思考&#xff1a;总油量减去总消耗大于等于零那么一定可以跑完一圈,局部贪心&#xff1a;累加每个站的净胜油量,如果<0,则在此之前(包括该站)都不是起始位置,从下一个位置开始寻找 class Solution { public:int canCompleteCircuit(vector<int>&…