之前在两篇文章中都有简单介绍或者提到过 自定义属性的用法:
25.Spring Boot使用自定义的properties【从零开始学Spring Boot】
51.spring boot属性文件之多环境配置【从零开始学SpringBoot】
但是在实际开发过程中有更复杂的需求,我们在对properties进一步的升华。在本篇博客中您将会学到如下知识(这节中有对之前的知识的温故,对之前的升华):
(1) 在application.properties文件中添加自定义属性(单个属性使用);
(2) 在application.properties文件中添加自定义属性(多个属性使用);
(3) 配置数组注入;
(4) 松散的绑定;
(5) 参数的引用;
(6) 随机数;
(7) 使用自定义的配置文件company.properties怎么操作;
(8) 在方法上使用@Bean的时候如何进行注入;
(9) 自定义结构;
(10) 校验;
好了,本文大纲就这么多,那么我一起来看看每个知识点都应该怎么去操作吧。
(1) 在application.properties文件中添加自定义属性(单个属性使用);
在这里我们新建一个maven java project进行测试,取名为:spring-boot-hello4。
对pom.xml基本的spring boot 配置,主要用到的一个核心依赖是:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
官方中对于spring-boot-configuration-processor是这么说明的:
通过使用spring-boot-configuration-processorjar, 你可以从被@ConfigurationProperties注解的节点轻松的产生自己的配置元数据文件。该jar包含一个在你的项目编译时会被调用的Java注解处理器。想要使用该处理器,你只需简单添加spring-boot-configuration-processor依赖。
好了,官方已经说得很清楚了,这个依赖主要可以在代码中轻松的使用@ConfigurationProperties注解注入属性文件配置的属性值。
单属性注入的比较简单,只需要在application.properties加入配置,如下:
#key = value的形式;
filePathLocation = d:/data/files
那么在对应需要使用的类中使用如下代码进行引入:
@Value("${filePathLocation}")
privateString filePathLocation;
这里使用@Value注解就可以为我们的变量filePathLocation设置上我们在application.properties文件中设置的key值了。
在实际开发中可能我们期望的是,如果没有设置key的话,设置一个默认值,使用如下代码即可实现(以上@Value的使用方式如果在没有设置key的话是会抛出异常的):
@Value("${filePathLocation1:d:/data/myfiles}")
privateString filePathLocation1;
这里的filePathLocation1我们并没有在application.properties文件中进行指定,但是查看打印信息是可以看到我们设置的默认值的,所以设置默认值的方式就是:
@Value(“${key:defaultVlaue}”)的形式进行设置。
(2) 在application.properties文件中添加自定义属性(多个属性使用);
多属性的设置也可以属性单属性的注入方式,但是这种方式不好,那么怎么比较优雅的注入多个属性值进行使用了。假设我们在application.properties定义了如下的属性:
#公司简称;
=知远信科
#公司位置;
com.kfit.company.location =北京海淀区
#公司联系方式;
com.kfit.company.mobile = 110****1195
#公司员工人数;
com.kfit.company.employCount = 100
接下来我们定义一个ComapnyProperties类进行设置这些参数。
package com.kfit.properties;
importorg.springframework.boot.context.properties.ConfigurationProperties;
importorg.springframework.stereotype.Component;
//prefix设置key的前缀;
@ConfigurationProperties(prefix = "com.kfit.company")
@Component
publicclass CompanyProperties {
private String name;
private String location;
private String mobile;
privateintemployCount;
public StringgetName() {
returnname;
}
publicvoid setName(String name) {
= name;
}
public StringgetLocation() {
returnlocation;
}
publicvoidsetLocation(String location) {
this.location = location;
}
public String getMobile(){
returnmobile;
}
publicvoidsetMobile(String mobile) {
this.mobile = mobile;
}
publicintgetEmployCount() {
returnemployCount;
}
publicvoid setEmployCount(intemployCount) {
this.employCount = employCount;
}
@Override
public StringtoString() {
return"CompanyProperties[name=" + name + ", location=" + location + ", mobile=" + mobile + ",employCount="
+employCount + "]";
}
}
那么之后我们就可以使用如下代码注入到要使用的这些属性的类进行使用了:
@Autowired
privateCompanyProperties companyProperties;
这里需要注意下:
第一:我们使用了@ConfigurationProperties(prefix= "com.kfit.company") 快速注入我们的属性,这里prefix是key的公共部分。
第二:这里我们使用@Component注解为spring 管理的类,那么在别的类才可以进行注入使用。
第三:在之前的文章中我们并没有使用@Component进行注册为spring 容器中,而是使用了@EnableConfigurationProperties({WiselySettings.class}) 这样的方式进行注入的。这两种方式都可以。
(3) 配置数组注入;
我们在application.properties定义数组:
# 员工列表
com.kfit.company.employs[0]=张三
com.kfit.company.employs[1]=李四
com.kfit.company.employs[2]=王五
类似这样的定义那么在对应的CompanyProperties文件中怎么接收呢?很简单,定义List<String>接收就可以了,代码如下:
privateList<String> employs = new ArrayList<String>();
这里的属性名称employs需要和application.properties文件的key是对应的。
这样employs注入了配置中的数据,打印为如下:
[张三, 李四, 王五]