欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot 配置文件详解

程序员文章站 2022-04-19 19:08:42
...

SpringBoot配置文件

全局配置文件能够对一些默认配置值进行修改。SpringBoot使用一个application.properties或者application.yaml/yml的文件作为全局配置文件,一般该文件存放在 src\main\resources 目录下,接下来将针对这两种全局配置文件进行讲解。

这三种文件的加载顺序在 spring-boot-starter-parent 的pom文件配置了,顺序如下

<includes>
  <include>**/application*.yml</include>
  <include>**/application*.yaml</include>
  <include>**/application*.properties</include>
</includes>

application.properties配置文件

使用Spring Initialize方式构建SpringBoot项目时,会在resource目录下自动生成一个空的applicatio.properties文件,SpringBoot启动时会自动加载application.properties文件。

我们可以在application.properties文件中定义SpringBoot项目的相关属性,当然,这些属性可以是系统属性、环境变量、命令参数等信息,也可以是自定义的配置。

server.port=8081
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.config.additional-location=
spring.config.location=
spring.config.name=application

那我们如何在Java类中使用这些配置呢?

新建Person类,该类需要注入配置文件的属性

@Component	// 将Person注入到SpringBean容器中
@ConfigurationProperties(prefix= "person")  // 将配置文件以person开头的属性注入到改类中
public class Person {
    private int id; 
    private String name; 
    private List hobby; 
    private String[] family; 
    private Map map;
    private Pet pet; 
    
    // 省略get/set方法
}

@ConfigurationProperties(prefix = “person”) 注解的作用是将配置文件中以person开头的属性通过setXXX()方法注入到实体类对应的属性中

@Component 注解的作用是将当前注入属性值的Person类对象作为Bean放到Spring IOC容器中,才能被@ConfigurationProperties 注解赋值

Person的依赖Pet类

public class Pet {
     private String type;
     private String name;
    // 省略get/set方法
}

我们在application.properties文件中配置如下:

person.id=1
person.name=cham
person.hobby=coding,game,sleep
person.map.k1=v1
person.map.k2=v2
person.pet.type=cat
person.pet.name=diudiu

编写application.properties配置文件时,由于要配置的Person对象属性是我们自定义的,SpringBoot无法自动识别,所以不会有任何代码提示。在实际开发中,为了出现代码提示来方便配置,在使用 @ConfigurationProperties 注解进行配置文件属性值注入时,可以在pom.xml文件引入SpringBoot提供的配置处理器依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

单元测试依赖:

<!--    单元测试    -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

测试输出:

@RunWith(SpringRunner.class)	// 测试启动器,并加载SpringBoot测试注解
@SpringBootTest 	// 标记为SpringBoot单元测试类,并加载项目的ApplicationContext上下文环境
class SpringbootDemoApplicationTests {
	
    @Autowired
    private Person person;
    
    @Test
    public void configurationTest() {
        System.out.println(person);
    }
}

输出:

Person(id=1, name=cham, hobby=[coding, game, sleep], family=null, map={k1=v1, k2=v2}, pet=Pet(type=cat, name=diudiu))

可以看出,测试方法成功运行,并且正确打印出了我们配置文件的属性,说明我们通过相关注解完成了属性注入

application.yaml/yml配置文件

YAML文件格式是SpringBoot支持的一种JSON超集文件格式,相较于传统的Properties配置文件,YAML文件以数据为核心,是一种更为直观且更容易被系统识别的数据序列化格式。application.yaml配置文件的工作原理和application.properties是一样的,只不过yaml格式配置文件看起来更简洁一些。

  • YAML文件的扩展名可以试.yml或者.yaml
  • application.yml文件使用 key:(空格) value 格式配置属性,使用缩进控制层级关系

这里针对不同数据类型的属性值,介绍一下YAML

  • value值为普通数据类型(例如数字、字符串、布尔等)时,可以直接配置对应的属性值,字符串不需要添加引号

    server:
      port: 8100
      tomcat:
        uri-encoding: utf-8
        
    spring:
      profiles:
        active: dev
      thymeleaf:
        cache: false
      jackson:
        date-format: yyyy-MM-dd HH:mm:ss
        time-zone: GMT+8
    
  • value值为数组或者单列集合,有三种写法

    person:
      hobby:
      	- coding
      	- game
      	- sleep
    
    person:
      hobby:
      	coding,
      	game,
      	sleep
    
    person:
      hobby: [coding,read,sleep]
    
  • value为Map集合或对象

    person:
      map:
        k1: v1
        k2: v2
    
    person:
      map: {k1: v1,k2: v2}
    

配置文件属性值的注入

使用SpringBoot 全局配置文件设置属性时:

  • 如果配置属性时SpringBoot已有的属性,比如服务端口server.port,那么SpringBoot内部会自动覆盖默认属性
  • 如果是自定义属性,需要使用这些属性,还必须在对应类中注入这些属性才能生效

SpringBoot支持多种注入配置文件属性的方式,下面介绍下如何使用注解 @ConfigurationProperties@Value 注入属性

使用@ConfigurationProperties注入属性

在上面的示例中已经讲过了,这里再介绍下

SpringBoot提供的**@ConfigurationProperties** 注解用来快速的将配置文件的属性批量注入到Bean对象的多个属性中。

@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private int id;
    public void setId(int id) {
        this.id = id;
    }
}

上述代码使用 @Component 和 @ConfigurationProperties 将配置文件的每个属性映射到Person中,且@ConfigurationProperties 注入时依赖Set() 方法。

使用@Value注入属性

@Value 是Spring框架提供的,用来读取配置文件中的一个属性值注入到Bean对象的对应属性值上

@Component
public class Person {
    @Value("${person.id}")
    private int id;
}

@Value 不依赖Set() 方法

自定义配置文件

比如我们定义了一个自定义配置文件 shiro.properties

# session 超时时间,单位为秒
shiro.session_timeout=86400
# rememberMe cookie有效时长,单位为秒
shiro.cookie_timeout=86400
# 免认证的路径配置,如静态资源等
shiro.anon_url=/test/**,/febs/**,/img/**,/layui/**,/json/**,/images/captcha,/public/test,/refreshCache
# 登录 url
shiro.login_url=/login
# 首页 url
shiro.success_url=/index
# 登出 url
shiro.logout_url=/logout
# 未授权跳转 url
shiro.unauthorized_url=/unauthorized

如何加载这个配置文件呢?

使用 @PropertySource 加载自定义配置文件

对于自定义配置文件,我们可以使用@PropertySource 注解结合 @Configuration 注解配置类方式来实现配置注入。

@PropertySource 注解用于指定配置文件的具体位置和名称

@Configuration 是为了保证SpringBoot能够扫描到@PropertySource 注解,将该实体类作为自定义配置类

@Configuration
@PropertySource(value = {"classpath:shiro.properties"})
@ConfigurationProperties(prefix = "shiro")
public class ShiroProperties {
    private long sessionTimeout;
    private int cookieTimeout;
    private String anonUrl;
    private String loginUrl;
    private String successUrl;
    private String logoutUrl;
    private String unauthorizedUrl;
    
    // 省略set方法
}

配置文件属性参数间的引用

app.name=MyApp
app.description=${app.name} is a Spring Boot application
相关标签: Spring # SpringBoot