Code Ease Code Ease
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档

神秘的鱼仔

你会累是因为你在走上坡路
  • 个人博客网站 (opens new window)
  • 好用的工具网站 (opens new window)
  • Java核心基础
  • 框架的艺术
  • 分布式与微服务
  • 开发经验大全
  • 设计模式
  • 版本新特性
数据库系列
大数据+AI
  • xxl-job
运维与Linux
  • 基于SpringBoot和BootStrap的论坛网址
  • 基于VuePress的个人博客网站
  • 基于SpringBoot开发的小功能
  • 做一个自己的IDEA插件
程序人生
关于我
  • 分类
  • 标签
  • 归档
服务器
  • Java核心基础

  • 框架的艺术

    • Spring

    • Mybatis

    • SpringBoot

      • 如何用SpringBoot(2.3.3版本)快速搭建一个项目
      • 一步步带你看SpringBoot(2.3.3版本)自动装配原理
      • SpringBoot配置文件及自动配置原理详解,这应该是SpringBoot最大的优势了吧
        • (一)概述
        • (二)配置文件从哪来的?
        • (三)配置文件处理总结
        • (四)自己写一个配置类
        • (五)结语
      • SpringBoot整合jdbc、durid、mybatis详解,数据库的连接就是这么简单
      • SpringBoot整合SpringSecurity详解,认证授权从未如此简单
      • SpringBoot整合Shiro详解,还在自己写登陆注册早落伍了
      • SpringBoot如何实现异步、定时任务?
      • 如何在SpringBoot启动时执行初始化操作,两个简单接口就可以实现
      • 如何使用SpringBoot写一个属于自己的Starter
      • SpringBoot请求日志,如何优雅地打印
      • 主线程的用户信息,到子线程怎么丢了
    • MQ

    • Zookeeper

    • netty

  • 分布式与微服务

  • 开发经验大全

  • 版本新特性

  • Java
  • 框架的艺术
  • SpringBoot
CodeEase
2023-09-20
目录

SpringBoot配置文件及自动配置原理详解,这应该是SpringBoot最大的优势了吧

作者:鱼仔
博客首页: codeease.top (opens new window)
公众号:Java鱼仔

# (一)概述

SpringBoot使用一个全局的配置文件来修改SpringBoot自动配置的默认值,SpringBoot提供了三种格式的配置文件:

3-1.png

如果一个项目中同时有上面三种配置文件,按顺序执行yml->yaml->properties,如果配置有冲突,则后执行的配置文件中的配置覆盖前面执行的。

yml和yaml具有相同的格式 key:空格value 注意这个空格不能没有

server:
  port: 8080
1
2

properties的格式为 key=value

server.port=8080
1

# (二)配置文件从哪来的?

springboot的配置文件中存在大量的配置,这一点在官网上就能看到了: https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/common-application-properties.html 如果要用的时候直接去官方文档或者百度取确实是个办法,但却并不是最好的办法,最好的办法是理解这些配置文件的原理,以后要用的时候直接通过原理去写配置文件。

在前面一章讲自动装配的时候我们已经知道了,Springboot项目在启动时会去META-INF/spring.factories取配置信息

3-2.png

配置文件的源头也来自于这里。

我们以Redis的配置类为例子讲解配置文件的原理,点开spring.factories,通过ctrl+F查找redis,可以找到一个叫RedisAutoConfiguration的类。

3-3.png

点进去后你能见到一个叫@EnableConfigurationProperties的注解,并且他后面会带上一个叫XXXProperties的类,Redis这里叫做RedisProperties。XXXProperties是配置文件的核心。 @EnableConfigurationProperties的意思是让@ConfigurationProperties 注解的类生效,后面我们就能看到

3-4.png

XXXProperties这个类被@ConfigurationProperties注解,这就和前面的@EnableConfigurationProperties对应上了,@ConfigurationProperties可以将配置文件(比如applicaition.yaml)加载进来,填充对象的对应字段的数据,然后供其他Bean使用。这里需要写一个前缀,在配置文件中通过"前缀.变量"的形式配置相应的值。

@ConfigurationProperties(prefix = "spring.redis")
public class RedisProperties {

   /**
    * Database index used by the connection factory.
    */
   private int database = 0;
   /**
    * Connection URL. Overrides host, port, and password. User is ignored. Example:
    * redis://user:password@example.com:6379
    */
   private String url;
   /**
    * Redis server host.
    */
   private String host = "localhost";
   /**
    * Login password of the redis server.
    */
   private String password;
   /**
    * Redis server port.
    */
   private int port = 6379;
   /**
    * Whether to enable SSL support.
    */
   private boolean ssl;
   /**
    * Connection timeout.
    */
   private Duration timeout;
   /**
    * Client name to be set on connections with CLIENT SETNAME.
    */
   private String clientName;
   private Sentinel sentinel;
   private Cluster cluster;
   private final Jedis jedis = new Jedis();
   private final Lettuce lettuce = new Lettuce();
   //。。。。。。。。。。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

看到这里我想你们已经知道配置文件的原理了,我们平常写的配置文件,肯定是为某一个类的变量赋予了值,我们写配置文件就可以通过“前缀.变量”的形式来写。 还是以上面的代码为例,我们如果想要给redis设置一个地址,“前缀.变量”就是spring.redis.host,这个值就会被RedisProperties 获取到,

3-5.png

# (三)配置文件处理总结

  1. 我们可以在META-INF/spring.factories中找到XXXAutoConfiguration这个自动装配类
  2. 所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;
  3. 配置文件能配置什么就可以参照某个功能对应的这个属性类

# (四)自己写一个配置类

既然我们知道了springboot是如何取配置文件的,那么我们可以自己来写一个配置类读取配置。 新建一个package properties,在里面新建一个类叫做UserProperties。

@Data
@Component
@ConfigurationProperties(prefix = "myproperties.user")
public class UserProperties {
    private String name;
    private Integer age;
}
1
2
3
4
5
6
7

在使用@ConfigurationProperties的同时必须激活它,我现在用了@Component让 Component Scan 扫描到,如果单纯写一个@ConfigurationProperties注解,会提示报错

Not registered via @EnableConfigurationProperties, marked as Spring component, or scanned via @ConfigurationPropertiesScan
1

接着在配置文件中赋值,我这里用的是application.yaml

myproperties:
  user:
    name: javayz
    age: 23
1
2
3
4

通过测试方法测试:

@SpringBootTest
class SpringbootdemoApplicationTests {
    @Autowired
    UserProperties userProperties;
    @Test
    void contextLoads() {
        System.out.println(userProperties);
    }
}
1
2
3
4
5
6
7
8
9

3-6.png

除了使用@Component来激活配置注解外,我们还可以参考源码的方式激活它:源码是这样写的

3-7.png

现在去除UserProperties的@Component注解,新建一个package config,并新建一个类叫UserConfig

@Configuration
@EnableConfigurationProperties(UserProperties.class)
public class UserConfig {
}
1
2
3
4

运行测试类后获得相同的正确结果。这就是阅读源码的好处,通过源码学习别人的编码方式。

# (五)结语

如果完整的看完整篇文章,我相信你对SpringBoot的配置文件以及自动配置的原理有了比较深刻的原理,看源码有时候并不难。

上次更新: 2025/04/29, 17:22:06
一步步带你看SpringBoot(2.3.3版本)自动装配原理
SpringBoot整合jdbc、durid、mybatis详解,数据库的连接就是这么简单

← 一步步带你看SpringBoot(2.3.3版本)自动装配原理 SpringBoot整合jdbc、durid、mybatis详解,数据库的连接就是这么简单→

最近更新
01
AI大模型部署指南
02-18
02
半个月了,DeepSeek为什么还是服务不可用
02-13
03
Python3.9及3.10安装文档
01-23
更多文章>
Theme by Vdoing | Copyright © 2023-2025 备案图标 浙公网安备33021202002405 | 浙ICP备2023040452号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式