添加依赖关系
首先我们需要添加spring boot依赖:
<parent> <groupid>org.springframework.boot</groupid> <artifactid>spring-boot-starter-parent</artifactid> <relativepath/> <!-- lookup parent from repository --></parent>
一个简单的例子
@configurationproperties需要和@configuration配合使用,我们通常在一个pojo里面进行配置:
@data@configuration@configurationproperties(prefix = mail)public class configproperties { private string hostname; private int port; private string from;}
上面的例子将会读取properties文件中所有以mail开头的属性,并和bean中的字段进行匹配:
#simple propertiesmail.hostname=host@mail.commail.port=9000mail.from=mailer@mail.com
spring的属性名字匹配支持很多格式,如下所示所有的格式都可以和hostname进行匹配:
mail.hostnamemail.hostnamemail.host_namemail.host-namemail.host_name
如果你不想使用@configuration, 那么需要在@enableconfigurationproperties注解中手动导入配置文件如下:
@springbootapplication@enableconfigurationproperties(configproperties.class)public class configpropapp { public static void main(string[] args) { springapplication.run(configpropapp.class,args); }}
我们也可以在@configurationpropertiesscan中指定config文件的路径:
@springbootapplication@configurationpropertiesscan(com.flydean.config)public class configpropapp { public static void main(string[] args) { springapplication.run(configpropapp.class,args); }}
这样的话程序只会在com.flydean.config包中查找config文件。
属性嵌套
我们可以嵌套class,list,map, 下面我们举个例子,先创建一个普通的pojo:
@datapublic class credentials { private string authmethod; private string username; private string password;}
然后创建一个嵌套的配置文件:
@data@configuration@configurationproperties(prefix = nestmail)public class nestconfigproperties { private string host; private int port; private string from; private list<string> defaultrecipients; private map<string, string> additionalheaders; private credentials credentials;}
对应的属性文件如下:
# nest simple propertiesnestmail.hostname=mailer@mail.comnestmail.port=9000nestmail.from=mailer@mail.com#list propertiesnestmail.defaultrecipients[0]=admin@mail.comnestmail.defaultrecipients[1]=owner@mail.com#map propertiesnestmail.additionalheaders.redelivery=truenestmail.additionalheaders.secure=true#object propertiesnestmail.credentials.username=johnnestmail.credentials.password=passwordnestmail.credentials.authmethod=sha1
@configurationproperties和@bean
@configurationproperties也可以和@bean一起使用如下所示:
@datapublic class item { private string name; private int size;}
看下怎么使用:
@data@configurationpublic class beanconfigproperties { @bean @configurationproperties(prefix = item) public item item() { return new item(); }}
属性验证
@configurationproperties可以使用标准的jsr-303格式来做属性验证。我们举个例子:
@data@validated@configuration@configurationproperties(prefix = mail)public class configproperties { @notempty private string hostname; @min(1025) @max(65536) private int port; @pattern(regexp = ^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,6}$) private string from;}
如果我们的属性不满足上诉条件,可能出现如下异常:
binding to target org.springframework.boot.context.properties.bind.bindexception: failed to bind properties under 'mail' to com.flydean.config.configproperties$$enhancerbyspringcglib$$f0f87cb9 failed: property: mail.port value: 0 reason: 最小不能小于1025 property: mail.hostname value: null reason: 不能为空action:update your application's configurationprocess finished with exit code 1
属性转换
@configurationproperties也支持多种属性转换,下面我们以duration和datasize为例:
我们定义两个duration的字段:
@configurationproperties(prefix = conversion)public class propertyconversion { private duration timeindefaultunit; private duration timeinnano; ...}
在属性文件中定义这两个字段:
conversion.timeindefaultunit=10conversion.timeinnano=9ns
我们看到上面的属性可以带单位的。可选的单位是:ns, us, ms, s, m, h 和 d,分别对应纳秒,微妙,毫秒,秒,分钟,小时和天。默认单位是毫秒。我们也可以在注解中指定单位:
@durationunit(chronounit.days)private duration timeindays;
对应的配置文件如下:
conversion.timeindays=2
下面我们再看看datasize怎么使用:
private datasize sizeindefaultunit; private datasize sizeingb; @datasizeunit(dataunit.terabytes)private datasize sizeintb;
对应的属性文件:
conversion.sizeindefaultunit=300conversion.sizeingb=2gbconversion.sizeintb=4
datasize支持b, kb, mb, gb 和tb。
自定义converter
同样的spring boot也支持自定义属性转换器。我们先定义一个pojo类:
public class employee { private string name; private double salary;}
对应的属性文件:
conversion.employee=john,2000
我们需要自己实现一个converter接口的转换类:
@component@configurationpropertiesbindingpublic class employeeconverter implements converter<string, employee> { @override public employee convert(string from) { string[] data = from.split(,); return new employee(data[0], double.parsedouble(data[1])); }}
以上就是springboot中@configurationproperties怎么使用的详细内容。