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

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: springboot的配置文件中存在大量的配置,这一点在官网上就能看到了:docs.spring.io/spring-boot…如果要用的时候直接去官方文档或者百度取确实是个办法,但却并不是最好的办法,最好的办法是理解这些配置文件的原理,以后要用的时候直接通过原理去写配置文件。在前面一章讲自动装配的时候我们已经知道了,Springboot项目在启动时会去META-INF/spring.factories取配置信息

点赞再看,养成习惯,听说微信搜公众号《Java鱼仔》会让自己的技术更上一层楼


(一)概述


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

网络异常,图片无法展示
|


如果一个项目中同时有上面三种配置文件,只会执行application*.yml,同理如果只有yaml和properties,只会执行yaml。


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


server:
  port: 8080

properties的格式为 key=value

server.port=8080

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


springboot的配置文件中存在大量的配置,这一点在官网上就能看到了:


https://link.juejin.cn/?target=https%3A%2F%2Fdocs.spring.io%2Fspring-boot%2Fdocs%2F2.1.6.RELEASE%2Freference%2Fhtml%2Fcommon-application-properties.html


如果要用的时候直接去官方文档或者百度取确实是个办法,但却并不是最好的办法,最好的办法是理解这些配置文件的原理,以后要用的时候直接通过原理去写配置文件。


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


网络异常,图片无法展示
|


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


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


网络异常,图片无法展示
|


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


网络异常,图片无法展示
|


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


@ConfigurationProperties(prefix="spring.redis")
publicclassRedisProperties {
/*** Database index used by the connection factory.*/privateintdatabase=0;
/*** Connection URL. Overrides host, port, and password. User is ignored. Example:* redis://user:password@example.com:6379*/privateStringurl;
/*** Redis server host.*/privateStringhost="localhost";
/*** Login password of the redis server.*/privateStringpassword;
/*** Redis server port.*/privateintport=6379;
/*** Whether to enable SSL support.*/privatebooleanssl;
/*** Connection timeout.*/privateDurationtimeout;
/*** Client name to be set on connections with CLIENT SETNAME.*/privateStringclientName;
privateSentinelsentinel;
privateClustercluster;
privatefinalJedisjedis=newJedis();
privatefinalLettucelettuce=newLettuce();
//。。。。。。。。。。

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


网络异常,图片无法展示
|

(三)配置文件处理总结


  1. 我们可以在META-INF/spring.factories中找到XXXAutoConfiguration这个自动装配类


  1. 所有在配置文件中能配置的属性都是在xxxxProperties类中封装着;


  1. 配置文件能配置什么就可以参照某个功能对应的这个属性类


(四)自己写一个配置类


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


@Data@Component@ConfigurationProperties(prefix="myproperties.user")
publicclassUserProperties {
privateStringname;
privateIntegerage;
}

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

Notregisteredvia@EnableConfigurationProperties, markedasSpringcomponent, orscannedvia@ConfigurationPropertiesScan

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

myproperties:
user:
name: javayzage: 23

通过测试方法测试:

@SpringBootTestclassSpringbootdemoApplicationTests {
@AutowiredUserPropertiesuserProperties;
@TestvoidcontextLoads() {
System.out.println(userProperties);
    }
}

网络异常,图片无法展示
|


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


网络异常,图片无法展示
|


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

@Configuration@EnableConfigurationProperties(UserProperties.class)
publicclassUserConfig {
}

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


(五)结语


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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4天前
|
Dart 前端开发 JavaScript
springboot自动配置原理
Spring Boot 自动配置原理:通过 `@EnableAutoConfiguration` 开启自动配置,扫描 `META-INF/spring.factories` 下的配置类,省去手动编写配置文件。使用 `@ConditionalXXX` 注解判断配置类是否生效,导入对应的 starter 后自动配置生效。通过 `@EnableConfigurationProperties` 加载配置属性,默认值与配置文件中的值结合使用。总结来说,Spring Boot 通过这些机制简化了开发配置流程,提升了开发效率。
37 17
springboot自动配置原理
|
2月前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
49 0
|
1月前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
1月前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
112 14
|
2月前
|
Java Spring
SpringBoot自动装配的原理
在Spring Boot项目中,启动引导类通常使用`@SpringBootApplication`注解。该注解集成了`@SpringBootConfiguration`、`@ComponentScan`和`@EnableAutoConfiguration`三个注解,分别用于标记配置类、开启组件扫描和启用自动配置。
69 17
|
2月前
|
Java 容器
springboot自动配置原理
启动类@SpringbootApplication注解下,有三个关键注解 (1)@springbootConfiguration:表示启动类是一个自动配置类 (2)@CompontScan:扫描启动类所在包外的组件到容器中 (3)@EnableConfigutarion:最关键的一个注解,他拥有两个子注解,其中@AutoConfigurationpackageu会将启动类所在包下的所有组件到容器中,@Import会导入一个自动配置文件选择器,他会去加载META_INF目录下的spring.factories文件,这个文件中存放很大自动配置类的全类名,这些类会根据元注解的装配条件生效,生效
|
2月前
|
Java 数据库连接 数据库
springboot启动配置文件-bootstrap.yml常用基本配置
以上是一些常用的基本配置项,在实际应用中可能会根据需求有所变化。通过合理配置 `bootstrap.yml`文件,可以确保应用程序在启动阶段加载正确的配置,并顺利启动运行。
427 2
|
2月前
|
Java Spring 容器
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
SpringBoot读取配置文件的6种方式,包括:通过Environment、@PropertySource、@ConfigurationProperties、@Value读取配置信息
233 3
|
3月前
|
Java Spring 容器
springboot @RequiredArgsConstructor @Lazy解决循环依赖的原理
【10月更文挑战第15天】在Spring Boot应用中,循环依赖是一个常见问题,当两个或多个Bean相互依赖时,会导致Spring容器陷入死循环。本文通过比较@RequiredArgsConstructor和@Lazy注解,探讨它们解决循环依赖的原理和优缺点。@RequiredArgsConstructor通过构造函数注入依赖,使代码更简洁;@Lazy则通过延迟Bean的初始化,打破创建顺序依赖。两者各有优势,需根据具体场景选择合适的方法。
177 4
|
3月前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
285 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件