SpringBoot 配置文件详解

文章目录

  • SpringBoot配置文件
    • application.properties配置文件
    • application.yaml/yml配置文件
    • 配置文件属性值的注入
      • 使用@ConfigurationProperties注入属性
      • 使用@Value注入属性
    • 自定义配置文件
      • 使用 @PropertySource 加载自定义配置文件
    • 配置文件属性参数间的引用

SpringBoot配置文件

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

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

<includes>
  <include>**/application*.ymlinclude>
  <include>**/application*.yamlinclude>
  <include>**/application*.propertiesinclude>
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.bootgroupId>
    <artifactId>spring-boot-configuration-processorartifactId>
    <optional>trueoptional>
dependency>

单元测试依赖:


<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-testartifactId>
    <scope>testscope>
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)