Spring Boot基础-配置文件使用详解

超、凢脫俗 2022-05-29 04:26 391阅读 0赞

使用Spring Boot进行应用开发时,配置项可以配置在配置文件中,Spring Boot通过一定的机制加载配置文件中的配置项,然后将设置到Bean中使用的地方去。
使用配置文件管理配置项有很多好处:

  • 使用配置文件时,修改配置项不需要重新编译,而修改Java文件中的值时需要重新编译后才能使用;也省去了打包等过程;
  • 使用配置文件时,可以很方便的将不同环境(如生产环境、测试环境、开发环境)的配置项独立到专门的文件中去,避免各个环境之间的配置项相互影响。这也是在生产系统运行过程中经常导致问题的一个场景。

下面将对Spring Boot的配置项使用方式进行详细分析。

1 基础

1.1 YAML与Properties

配置文件格式有两种,一种是properties后缀的文件,一种是yml后缀的文件。
如properties文件:

  1. person.name=test
  2. person.age=20

其对应的yml文件:

  1. person:
  2. name: test
  3. 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

  1. test:
  2. parama: testParamA

1.4.2 通过Value注解使用配置项

  1. @RestController
  2. @RequestMapping("/test")
  3. public class TestController {
  4. private static final Logger logger = LoggerFactory.getLogger(TestController.class);
  5. @Value("${test.parama}")
  6. private String testParamA;
  7. @RequestMapping("/testProps")
  8. public String testProps() {
  9. return testParamA;
  10. }
  11. }

启动应用后浏览器直接访问:http://localhost/test/testProps 可以看到配置文件中配置的值”testParamA”被返回。

Value除了可以使用在属性上面对属性进行赋值外,还可以使用在Controller中被RequestMapping注解的方法参数上,如:

  1. @RequestMapping("/testProps")
  2. public String testProps(@Value("${test.parama}") String testParamA) { return testParamA; }

它也可以使用在构造函数上: 

  1. public TestService(@Value("test.parama") String paramA) {
  2. this.cParamA = paramA;
  3. }

1.5 命令行指定配置项

除通过配置文件外,Spring Boot也可以识别在启动时通过–指定的参数,如java -jar test.jar –test.parama=testParamA。
通过命令行指定的参数是优先级最高的,因此在多处指定时将会以命令行的为准。

1.6 配置项值随机

在配置文件中,可以使用RandomValuePropertySource来提供一些随机值,如:

  1. my.secret=${random.value}
  2. my.number=${random.int}
  3. my.bignumber=${random.long}
  4. my.uuid=${random.uuid}
  5. my.number.less.than.ten=${random.int(10)}
  6. my.number.in.range=${random.int[1024,65536]}

2 Profile

Profile用于配置不同环境的参数,如生产环境也测试环境,某些外部系统的IP肯定是不一样的,因此在实际的项目中一般会有多个配置文件,如开发环境对应一个、测试环境对应一个、生产环境对应一个等。

2.1 同一文件中配置不同环境的配置项

在同一配置文件application.yml中配置不同环境的配置项,可以通过如下方式进行:   

  1. server:
  2. port: 80  #默认端口
  3. spring:
  4. profiles:
  5. active: prd #当前使用的配置
  6. ---
  7. #开发环境配置
  8. spring:
  9. profiles: dev
  10. server:
  11. port: 8080
  12. ---
  13. #生产环境配置
  14. spring:
  15. profiles: prd
  16. server:
  17. 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方法;

  1. @ConfigurationProperties("admin")
  2. public class Admin {
  3. private String name;
  4. private int age;
  5. private Contact contact;
  6. ...
  7. }
  8. public class Contact {
  9. private String name;
  10. ...
  11. }

其中Admin需要使用ConfigurationProperties注解,指明它从配置文件中获取admin下的所有属性配置到Admin对象中来。

3.1.2 @EnableConfigurationProperties引入对象

EnableConfigurationProperties注解用于引入被ConfigurationProperties注解的对象,并将其注入到Spring容器中去;
它需要与Configuration注解一起使用: 

  1. @Configuration
  2. @EnableConfigurationProperties(Admin.class)
  3. public class MainConfiguration {
  4. }

也可以通过@Bean的方式直接将其注入到Spring容器中。

  1. @Bean
  2. public Admin createAdmin() {
  3. return new Admin();
  4. }

或者Admin对象中ConfigurationProperties与Component一起使用: 

  1. @ConfigurationProperties("admin")
  2. @Component
  3. public class Admin {
  4. ...
  5. }

完成这一步后就可以通过Autowired的方式将User注入到其它Bean中进行使用了。

3.2 校验

ConfigurationProperties注解的对象可以与Validated、Valid、NotNull、NotEmpty等注解一起使用来对配置文件中的属性进行校验,如校验admin.name不为空: 

  1. @ConfigurationProperties("admin")
  2. @Component
  3. @Validated
  4. public class User {
  5. @NotEmpty
  6. private String name;
  7. private int age;
  8. private Contact contact;
  9. ...
  10. }

发表评论

表情:
评论列表 (有 0 条评论,391人围观)

还没有评论,来说两句吧...

相关阅读