Mongoosej.Blog.Software.Programming.Java.Framework.Spring.SpringBoot.Aspect
外部配置
Spring Boot lets you externalize your configuration so that you can work with the same application code in different environments. You can use a variety of external configuration sources, include Java properties files, YAML files, environment variables, and command-line arguments. Spring Boot允许您将配置外部化,以便您可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括 Java 属性文件、YAML 文件、环境变量和命令行参数。
SpringBoot配置加载顺序如下:
- SpringApplication.setDefaultProperties方法指定的配置。
配置文件加载位置
spring boot启动时会扫描以下位置的application.properties或者application.yml文件作为spring boot的默认配置文件:
- file:./config/ 即当前目录下的config目录下的application.properties或者application.yml文件
- file:./ 即当前目录下的application.properties或者application.yml文件
- classpath:/config/ 即类路径下的config目录下的application.properties或者application.yml文件
- classpath:/ 即类路径下的application.properties或者application.yml文件
以上是按照优先级从高到低的顺序,所有以上位置下的application.properties或者application.yml文件都会被加载,但是高优先级的配置文件中的配置会覆盖低优先级的配置文件中的配置,配置文件之间会形成配置互补。也可以通过命令行指定spring.config.location命令行参数,来指定最高优先级的配置文件目录。
配置文件可配置属性
[spring-boot-reference.pdf].Appendix A: Common Application Properties
As well as application property files, Spring Boot will also attempt to load profile-specific files using the naming convention application-{profile}. For example, if your application activates a profile named prod and uses YAML files, then both application.yml and application-prod.yml will be considered. Profile-specific properties are loaded from the same locations as standard application.properties, with profile-specific files always overriding the non-specific ones. If several profiles are specified, a last-wins strategy applies. For example, if profiles prod,live are specified by the spring.profiles.active property, values in application-prod.properties can be overridden by those in application-live.properties.
当指定active profile时,application.yml和application-spc.yml都会被加载,并且application-spc.yml总时覆盖application.yml中的相同属性。
@ConfigurationProperties与@Value区别
功能 | @ConfigurationProperties | @Value |
---|---|---|
配置文件中的属性注入 | 批量注入 | 一个个指定注入 |
松散绑定(Relaxed Binding) | 支持 | 不支持 |
SpringEL | 不支持 | 支持 |
JSR303数据校验 | 支持 | 不支持 |
复杂数据类型注入(Map、List等) | 支持 | 不支持 |
spring boot自动配置原理
- spring boot启动@SpringBootApplication标注的主配置类时,默认开启了@EnableAutoConfiguration功能
- @EnableAutoConfiguration的作用就是利用@@EnableAutoConfigurationImportSelector给容器中注入自动配置的组件,实际上就是扫描所有jar包类路径下的META-INF/spring-factories文件,并把该文件中的值包装为proerties类对象
- 然后从包装的proerties类对象中获取EnableAutoConfiguration.class这个类的类名所表示的key对应的value值
- 这个值对应的就是一堆自动配置类的类路径
- spring boot就会加载这些自动配置类
- xxxAutoConfiguration就是自动配置类,用于向spring ioc容器中注入自动配置的组件,自动配置类是否生效会有条件限制(可以使用debug=true属性来打印自动配置报告)
- 自动配置类中有xxxProperties,是封装配置文件中相关属性的类,自动配置类在向spring ioc容器注入组件时,构造组件使用的属性,就是使用封装的配置文件类中的属性值。属性封装类使用了@ConfigurationProperties标注,所以会和配置文件中的属性自动匹配。
- 每个自动配置类就是根据自动配置类中的属性封装类与配置文件中的配置匹配后,再使用属性封装类中的属性实现需要注入spring ioc容器的组件的属性注入,所有自动配置类都注入到spring ioc容器后,自动配置完成。
所以:
- 我们只需要看spring boot中有没有我们功能需要的默认配置类
- 如果有的话,就找到那个默认配置类,从中发掘出自动配置类中的属性封装类,然后就可以根据属性封装类中的属性就行个性化配置
spring boot日志
日志门面(日志抽象) | 日志实现 |
---|---|
JCL(Jakarta Commons Logging) | log4j |
SLF4J(Simple Logging Facade for Java) | JUL(java.util.logging) |
jboss-logging | log4j2 |
logback |
日志配置文件,使用日志实现的配置文件格式。
spring使用JCL+log4j2
springboot能使用所有的日志框架,默认使用slf4j+logback,且默认info级别
一个应用系统,可能会使用很多中框架,而每种不同的框架可能会使用不同的日志门面和日志实现,如何统一?
- 将系统中使用的其他日志框架剔除
- 使用slf4j提供的中间包代替原来的日志框架(有原来的类,但是类的实现指向了slf4j)
- 使用需要的日志实现