1:概述
Spring Boot支持根据应用的实际需要,进行自定义配置, Spring Boot能从多种属性源获得属性,包括如下几处:
2:可调整的属性
对于Spring Boot自动配置的Bean,目前提供了上千个用于微调的属性。
具体的可以参看官方文档:
https://docs.spring.io/spring-boot/docs/2.0.0.M4/reference/htmlsingle/#common-application-properties
3: 自定义属性
Spring Boot允许使用properties文件、yml文件或者命令行参数作为外部配置,并提供自定义属性的支持。比如我们可以在application.properties配置一些常量,例如:
cc.add.k1=k1vv
cc.add.k2=k222
然后直接在要使用的地方通过注解@Value(value=”${config.name}”)就可以绑定到你想要的属性上面
-
1:使用@Value注解,可以直接将属性值注入到你的beans中,也可以通过Spring的Environment抽象或绑定到结构化对象来访问。
-
2:如果属性太多了,一个个绑定到属性字段上太累,官方提倡绑定一个对象的bean,比如:这里我们建一个ConfigBean.java类,顶部需要使用注解@ConfigurationProperties(prefix = “cc.add”)来指明使用哪个,示例如下:
@ConfigurationProperties(prefix="cc.add")
public class SysConf {
private String k1;
private String k2;
// 省略getter和setter
}
- 3:然后在启动类上添加:
@EnableConfigurationProperties({SysConf.class})
- 4:然后就可以在要使用的类里面直接注入了:
@Autowired
private SysConf sc;
5:也可以使用
@Autowired
private Environment env;
然后用env.getProperty(“cc.add.k1”)去访问
4: 参数间引用
在application.properties中的各个参数之间也可以直接引用来使用,使用${paramID},如:
cc.add.k1=k1vv
cc.add.k2=k222-${cc.add.k1}
5: 使用自定义配置文件
有时候我们不希望把所有配置都放在application.properties里面,这时候我们可以另外定义一个,比如:my.properties,形如:
cc.add.k3=k3vv
cc.add.k4=k444-${cc.add.k1}
1:然后再写一个配置bean,形如:
@Configuration
@ConfigurationProperties(prefix = "cc.add")
@PropertySource("classpath:my.properties")
public class MyConf {
private String k3;
private String k4;
}
由于配置了@Configuration,因此不用在启动类中添加了
2:使用方法跟前面使用属性配置类SysConf是一样的
6: 配置随机值
可以使用${random} 可以用来生成各种不同类型的随机值,例如:
${random.value}
${random.int}
${random.long}
${random.uuid}
${random.int(5)}
${random.int[5,10]}
7: 配置文件的放置位置
自定义的配置文件,有多个可以放置的位置:
(1)外置,在相对于应用程序运行目录的/config子目录里
(2)外置,在应用程序运行的目录里
(3)内置,在config包内
(4)内置,在Classpath根目录
1:这个列表按照优先级排序。也就是说,/config子目录里的application.properties会覆盖应用程序Classpath里的application.properties中的相同属性。
2:此外,如果你在同一优先级位置同时有application.properties和application.yml,那么application.properties里的属性会覆盖application.yml里的属性(有资料说的相反)
微调自动配置示例
简单的给出几个微调自动配置的例子,以学习微调的方法。
1:配置嵌入式服务器端口,形如:server.port=9080
配置上下文路径,形如:server.context-path=/myweb
8: 配置日志
默认情况下,Spring Boot会用Logback来记录日志,并用INFO级别输出到控制台。一般来说,你不需要切换日志实现;Logback能很好地满足你的需要。
1:如果决定使用Log4j或者Log4j2,那么你只需要修改依赖,引入对应该日志实现的起步依赖,同时排除掉 Logback。
以Maven为例,应排除掉根起步依赖传递引入的默认日志起步依赖,这样就能排除 Logback了,形如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
2:通常对日志配置最常做的改动就是修改日志级别和指定日志输出的文件。使用了 Spring Boot的配置属性后,可以在不创建logback.xml文件的情况下修改那些配置。
在application.properties里设置:
logging.path=/var/logs/
logging.file=my.log
logging.level.root=WARN
logging.level.root.org.springframework.security=DEBUG
3:假设应用程序有/var/logs/的写权限,日志就能被写入/var/logs/my.log。默认情况下,日志文件的大小达到10MB时会切分一次。
4:要完全掌握日志配置,可以在Classpath的根目录(src/main/resources)里创建logback.xml文 件。下面是一个logback.xml的简单例子:
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<logger name="root" level="INFO"/>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
5:由于日志是在ApplicationContext被创建之前初始化,所以不可能在Spring的@Configuration文件中,通过系统属性和传统的外部配置文件来进行调整。
9: 使用profile
1:遵循application-{profile}. properties/yml这种命名格式,这样就能提供特定于Profile的属性了。形如:
application-dev.properties
application-test.properties
2:在application.properties中使用spring.profiles.active属性来设置具体要使用哪一个profile
(1)可以启动多个profile,如:
spring.profiles.active=test,testConf
(2)还可以用spring.profiles.include来叠加profile
spring.profiles.include=test,testConf
3:可以用profile的配置文件来分区配置我们的环境变量,在类里,还可以直接用@Profile注解来进行配置
(1)定义配置用的接口,如:
public interface MyProfile {
String getDBConf();
}
(2)实现配置接口,如:
@Component
@Profile("devConf")
public class Dev implements MyProfile {
public String getDBConf() {
return "devDB";
}
}
@Component
@Profile("testConf")
public class ForTest implements MyProfile{
public String getDBConf() {
return "testDB";
}
}
(3)在properties配置文件中配置:
spring.profiles.include=test,devConf
(4)在需要获取配置的类里面就可以直接注入来使用了,如:
@Autowiredprivate
MyProfile mp;