SpringBoot 配置文件详解

    技术2022-07-10  184

    文章目录

    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*.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或者.yamlapplication.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
    Processed: 0.033, SQL: 9