springboot-自动配置

devtools/2024/10/18 16:54:00/

一、自动配置的原理
Spring Boot 的自动配置基于以下几个核心概念:

条件注解 (Conditional Annotations):@Conditional 系列注解用于根据特定条件判断是否加载某个配置类或 Bean。
自动配置类 (Auto-configuration Classes):这些类通过 META-INF/spring.factories 文件被自动加载。
配置属性 (Configuration Properties):通过外部化配置来控制自动配置的行为。

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

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

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

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

java"><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency>
</dependencies>

2. 主类和基本配置
创建一个主类,并添加 @SpringBootApplication 注解:

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

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

首先,创建 MyService 类:

java">public class MyService {public void perform() {System.out.println("Performing a task...");}
}

然后,创建自动配置类 MyServiceAutoConfiguration:

java">import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;@Configuration
public class MyServiceAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService() {return new MyService();}
}

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

java">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.demo.MyServiceAutoConfiguration

4. 使用自定义自动配置
在 Spring Boot 应用中,我们可以直接注入 MyService 并使用它:

java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MyController {@Autowiredprivate MyService myService;@GetMapping("/perform")public String performTask() {myService.perform();return "Task performed!";}
}

启动应用程序,访问 http://localhost:8080/perform,可以看到控制台输出 “Performing a task…”。

四、自动配置的深入理解
1. 条件注解
Spring Boot 提供了丰富的条件注解,用于控制配置类或 Bean 的加载:

@ConditionalOnClass:当类路径上存在指定的类时,才会实例化相应的 Bean。
@ConditionalOnMissingBean:当容器中不存在指定的 Bean 时,才会实例化相应的 Bean。
@ConditionalOnProperty:当指定的配置属性存在并符合预期时,才会实例化相应的 Bean。
2. 配置属性
通过外部化配置(如 application.properties 或 application.yml),可以控制自动配置的行为:

java">my.service.enabled=true

在自动配置类中,可以使用 @ConditionalOnProperty 注解来实现基于配置属性的条件加载:

java">@Configuration
@ConditionalOnProperty(name = "my.service.enabled", havingValue = "true", matchIfMissing = true)
public class MyServiceAutoConfiguration {// ...
}

五、禁用自动配置
在某些情况下,你可能需要禁用特定的自动配置。可以使用 @SpringBootApplication 注解的 exclude 属性:

java">@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class DemoApplication {// ...
}

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

相关文章

后端大量数据返回,采用数据压缩+分片操作,加快前端响应速度,个人技术总结

1. 业务场景 场景类似于&#xff0c;可以查看到这段时间内指定的所有物品的运动轨迹&#xff0c;可以进行回放操作。 2. 解决方案 2.1. 在不考虑压缩的情况&#xff0c;可以尽可能减少传输数据的大小 比如 {[{"consDept":"A部门","consDeptCode&…

计算机网络 —— 网络层(IP数据报)

计算机网络 —— 网络层&#xff08;IP数据报&#xff09; 网络层要满足的功能IP数据报IP数据报格式IP数据报首部格式数据部分 IP数据报分片 我们今天进入网络层的学习。 网络层要满足的功能 网络层作为OSI模型中的第三层&#xff0c;是计算机网络体系结构的关键组成部分&…

视图、触发器、存储过程、函数语法

数据库相关语法 视图&#xff1a;触发器&#xff1a;场景&#xff1a;应用&#xff1a; 存储过程&#xff1a;场景&#xff1a;应用&#xff1a; 函数&#xff1a;预定义函数&#xff1a;数学类函数&#xff1a;字符串类函数 &#xff1a;日期时间类函数&#xff1a; 自定义函数…

传输层——TCP协议

目录 TCP协议 TCP协议段格式 确认应答机制&#xff08;ACK&#xff09; 序号与确认序号 32位序号 32位确认序号 确认应答(ACK)机制 16位窗口大小 六个标志位 超时重传机制 连接管理机制 三次握手 四次挥手 理解CLOSE_WAIT状态 理解TIME_WAIT状态 ​编辑流量控制…

大数据之Hadoop是什么?Hadoop起源?

什么是Hadoop Hadoop 是一个用于存储和处理大规模数据集(大数据)的分布式存储和分布式计算平台。它由 Apache 软件基金会维护,并基于 Java 编程语言编写。Hadoop 的核心设计理念是能够在普通硬件上运行,并且能够处理非常大的数据集。狭义上说Hadoop就是一个框架平台,广义…

机器学习——决策树

决策树 决策树可以理解为是一颗倒立的树&#xff0c;叶子在下端&#xff0c;根在最上面 一层一层连接的是交内部节点&#xff0c;内部节点主要是一些条件判断表达式&#xff0c;叶子叫叶节点&#xff0c;叶节点其实就是最终的预测结果&#xff0c;那么当输入x进去&#xff0c;…

[Shell编程学习路线]——编制第一个shell脚本入门篇

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月12日10点23分 &#x1f004;️文章质量&#xff1a;93分 目录 ——前言—— &#x1f4a5;常用的几种shell Bash Sh …

173.二叉树:找树左下角的值(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr, right(nullptr) {}* Tree…