Spring Boot基础-配置文件使用详解
使用Spring Boot进行应用开发时,配置项可以配置在配置文件中,Spring Boot通过一定的机制加载配置文件中的配置项,然后将设置到Bean中使用的地方去。
使用配置文件管理配置项有很多好处:
- 使用配置文件时,修改配置项不需要重新编译,而修改Java文件中的值时需要重新编译后才能使用;也省去了打包等过程;
- 使用配置文件时,可以很方便的将不同环境(如生产环境、测试环境、开发环境)的配置项独立到专门的文件中去,避免各个环境之间的配置项相互影响。这也是在生产系统运行过程中经常导致问题的一个场景。
下面将对Spring Boot的配置项使用方式进行详细分析。
1 基础
1.1 YAML与Properties
配置文件格式有两种,一种是properties后缀的文件,一种是yml后缀的文件。
如properties文件:
person.name=test
person.age=20
其对应的yml文件:
person:
name: test
age: 20
可以看到YML文件能够展现更加清晰的配置项层级,在配置项很多的情况下两者的差距更加明显。
1.2 配置文件位置及名称
默认情况下,Spring Boot将会从以下位置加载application.yml或者是application.properties文件:
- 当前目录下的config子目录,当前目录指的是,将项目打包成JAR包后,JAR包所在的目录;
- 当前目录
- classpath下的config子目录
- classpath下的根目录
这四个位置的优先级从上往下递减,也就是说当前目录下的config子目录优先级最高;classpath下的根目录优先级最低。
默认的配置文件名application.yml或者是application可以通过命令行的方式在启动时进行修改,如:
$ java -jar myproject.jar –spring.config.name=myproject
也可以修改配置文件所在的目录,甚至可以指定多个不同目录下的配置文件:
$ java -jar myproject.jar –spring.config.location=classpath:/default.properties,classpath:/override.properties
通过命令行指定的配置文件默认是优先级最高的。
1.3 文件内引用
可以在配置文件中引用前面已经定义好的配置项,如:
app.name=MyApp
app.description=${app.name} is a Spring Boot application
1.4 简单示例
在本示例上,使用yml在默认的配置项中添加自定义的配置项,然后在Bean中使用它。
1.4.1 配置文件application.yml
test:
parama: testParamA
1.4.2 通过Value注解使用配置项
@RestController
@RequestMapping("/test")
public class TestController {
private static final Logger logger = LoggerFactory.getLogger(TestController.class);
@Value("${test.parama}")
private String testParamA;
@RequestMapping("/testProps")
public String testProps() {
return testParamA;
}
}
启动应用后浏览器直接访问:http://localhost/test/testProps 可以看到配置文件中配置的值”testParamA”被返回。
Value除了可以使用在属性上面对属性进行赋值外,还可以使用在Controller中被RequestMapping注解的方法参数上,如:
@RequestMapping("/testProps")
public String testProps(@Value("${test.parama}") String testParamA) { return testParamA; }
它也可以使用在构造函数上:
public TestService(@Value("test.parama") String paramA) {
this.cParamA = paramA;
}
1.5 命令行指定配置项
除通过配置文件外,Spring Boot也可以识别在启动时通过–指定的参数,如java -jar test.jar –test.parama=testParamA。
通过命令行指定的参数是优先级最高的,因此在多处指定时将会以命令行的为准。
1.6 配置项值随机
在配置文件中,可以使用RandomValuePropertySource来提供一些随机值,如:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
2 Profile
Profile用于配置不同环境的参数,如生产环境也测试环境,某些外部系统的IP肯定是不一样的,因此在实际的项目中一般会有多个配置文件,如开发环境对应一个、测试环境对应一个、生产环境对应一个等。
2.1 同一文件中配置不同环境的配置项
在同一配置文件application.yml中配置不同环境的配置项,可以通过如下方式进行:
server:
port: 80 #默认端口
spring:
profiles:
active: prd #当前使用的配置
---
#开发环境配置
spring:
profiles: dev
server:
port: 8080
---
#生产环境配置
spring:
profiles: prd
server:
port: 8081
如上述配置中,当spring.profiles.active值为dev时,使用的是开发环境配置中的配置项,端口启用的将会是8080;否则将会使用注释为“生产环境配置”的配置项,使用端口为8081。
通过这种配置,在生产环境启动时,就可以在启动时直接通过–spring.profiles.active=prd来指定当前运行的环境是生产环境了。
但这种方式中多个环境配置项在同一文件中,会导致配置项乱且难管理;Spring Boot提供了更加合理的方式来管理不同环境的配置项:每个环境对应一个或者多个配置文件;不同环境的配置文件完全独立开。
2.2 不同文件中配置不同环境的配置项
现在假设有dev/prd两个环境,需要创建两个配置文件:application-dev.yml与application-prd.yml;两个配置文件所放的目录与application.yml是一样的。
在生产环境启动时,通过–spring.profiles.active=prd可以指定读取application-prd.xml文件中的配置项;
开发环境时通过–spring.profiles.active=dev可以指定读取application-dev.xml文件中的配置项。
也可以提供application-default.xml文件,如果启动时没有指定–spring.profiles.active的值,则会默认读取这个文件中的配置项。
3 ConfigurationProperties
使用Value注解来引用配置文件有时候会较为麻烦,如配置项含有层级时。Spring Boot可以使用ConfigurationProperties注解来替代Value注解的使用,它含有一些较为高级的用法:
3.1 配置文件配置项自动转换到对象
现在假设有以下配置文件需要加载admin下的所有配置文件到对象中去:
admin:
name: admin
age: 20
contact:
name: contact
3.1.1 对象创建
现在创建两个对象,Admin和Contact,代码省去Get与Set方法;
@ConfigurationProperties("admin")
public class Admin {
private String name;
private int age;
private Contact contact;
...
}
public class Contact {
private String name;
...
}
其中Admin需要使用ConfigurationProperties注解,指明它从配置文件中获取admin下的所有属性配置到Admin对象中来。
3.1.2 @EnableConfigurationProperties引入对象
EnableConfigurationProperties注解用于引入被ConfigurationProperties注解的对象,并将其注入到Spring容器中去;
它需要与Configuration注解一起使用:
@Configuration
@EnableConfigurationProperties(Admin.class)
public class MainConfiguration {
}
也可以通过@Bean的方式直接将其注入到Spring容器中。
@Bean
public Admin createAdmin() {
return new Admin();
}
或者Admin对象中ConfigurationProperties与Component一起使用:
@ConfigurationProperties("admin")
@Component
public class Admin {
...
}
完成这一步后就可以通过Autowired的方式将User注入到其它Bean中进行使用了。
3.2 校验
ConfigurationProperties注解的对象可以与Validated、Valid、NotNull、NotEmpty等注解一起使用来对配置文件中的属性进行校验,如校验admin.name不为空:
@ConfigurationProperties("admin")
@Component
@Validated
public class User {
@NotEmpty
private String name;
private int age;
private Contact contact;
...
}
还没有评论,来说两句吧...