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;
    ...
}

猜你喜欢

转载自blog.csdn.net/icarusliu/article/details/79585206