但是在实际开发过程中有更复杂的需求,我们在对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 配置,主要用到的一个核心依赖是:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-configuration-processor</artifactId>
  4. <optional>true</optional>
  5. </dependency>

官方中对于spring-boot-configuration-processor是这么说明的:

通过使用spring-boot-configuration-processor jar, 你可以从被@ConfigurationProperties注解的节点轻松的产生自己的配置元数据文件。该jar包含一个在你的项目编译时会被调用的Java注解处理器。想要使用该处理器,你只需简单添加spring-boot-configuration-processor依赖。

好了,官方已经说得很清楚了,这个依赖主要可以在代码中轻松的使用@ConfigurationProperties注解注入属性文件配置的属性值。

单属性注入的比较简单,只需要在application.properties加入配置,如下:

  1. #key = value的形式;
  2. filePathLocation = d:/data/files

那么在对应需要使用的类中使用如下代码进行引入:

  1. @Value("${filePathLocation}")
  2. private String filePathLocation;

这里使用@Value注解就可以为我们的变量filePathLocation设置上我们在application.properties文件中设置的key值了。

在实际开发中可能我们期望的是,如果没有设置key的话,设置一个默认值,使用如下代码即可实现(以上@Value的使用方式如果在没有设置key的话是会抛出异常的):

  1. @Value("${filePathLocation1:d:/data/myfiles}")
  2. private String filePathLocation1;

这里的filePathLocation1我们并没有在application.properties文件中进行指定,但是查看打印信息是可以看到我们设置的默认值的,所以设置默认值的方式就是:

@Value(“${key:defaultVlaue}”) 的形式进行设置。

(2) 在application.properties文件中添加自定义属性(多个属性使用);

多属性的设置也可以属性单属性的注入方式,但是这种方式不好,那么怎么比较优雅的注入多个属性值进行使用了。假设我们在application.properties定义了如下的属性:

#公司简称;

com.kfit.company.name =知远信科

#公司位置;

com.kfit.company.location =北京海淀区

#公司联系方式;

com.kfit.company.mobile = 110****1195

#公司员工人数;

com.kfit.company.employCount = 100

接下来我们定义一个ComapnyProperties类进行设置这些参数。

package com.kfit.properties;

import org.springframework.boot.context.properties.ConfigurationProperties;

import org.springframework.stereotype.Component;

//prefix设置key的前缀;

@ConfigurationProperties(prefix = "com.kfit.company")

@Component

public class CompanyProperties {

private String name;

private String location;

private String mobile;

private int employCount;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getLocation() {

return location;

}

public void setLocation(String location) {

this.location = location;

}

public String getMobile() {

return mobile;

}

public void setMobile(String mobile) {

this.mobile = mobile;

}

public int getEmployCount() {

return employCount;

}

public void setEmployCount(intemployCount) {

this.employCount = employCount;

}

@Override

public String toString() {

return "CompanyProperties [name=" + name + ", location=" + location + ", mobile=" + mobile + ", employCount="

+ employCount + "]";

}

}

那么之后我们就可以使用如下代码注入到要使用的这些属性的类进行使用了:

  1. @Autowired
  2. private CompanyProperties companyProperties;

这里需要注意下:

第一:我们使用了@ConfigurationProperties(prefix = "com.kfit.company") 快速注入我们的属性,这里prefix是key的公共部分。

第二:这里我们使用@Component 注解为spring 管理的类,那么在别的类才可以进行注入使用。

第三:在之前的文章中我们并没有使用@Component进行注册为spring 容器中,而是使用了@EnableConfigurationProperties({WiselySettings.class})  这样的方式进行注入的。这两种方式都可以。

(3) 配置数组注入;

我们在application.properties定义数组:

  1. # 员工列表
  2. com.kfit.company.employs[0]=张三
  3. com.kfit.company.employs[1]=李四
  4. com.kfit.company.employs[2]=王五

类似这样的定义那么在对应的CompanyProperties文件中怎么接收呢?很简单,定义List<String>接收就可以了,代码如下:

private List<String> employs = new ArrayList<String>();

这里的属性名称employs需要和application.properties文件的key是对应的。

这样employs注入了配置中的数据,打印为如下:

[张三, 李四, 王五]

(4) 松散的绑定;

Spring Boot使用宽松的规则用于绑定属性到@ConfigurationProperties beans,所以Environment属性名和bean属性名不需要精确匹配。常见的示例中有虚线分隔的(比如,context-path绑定到contextPath),环境属性大写转为小写字母(比如:PORT绑定port)。

示例:

在application.properties文件中的配置:

  1. com.kfit.company.firstName = lin
  2. com.kfit.company.logo-path = d:/data/files/logo.png
  3. com.kfit.company.COMPANY_FULLNAME =北京知远科技公司

对应的CompanyProperties类中的对应定义:

  1. //对应:com.kfit.company.firstName = lin
  2. private String firstName;
  3. //对应:com.kfit.company.logo-path = d:/data/files/logo.png
  4. private String logoPath;
  5. //对应:com.kfit.company.COMPANY_FULLNAME = 北京知远科技公司
  6. private String companyFullname;
  7. private List<String> employs = new ArrayList<String>();

看到这里,你是否终于知道为什么context-path,spring.jpa.show-sql

其实是被解释为contextPath和showSql了,不然要是指定定义一个show-sql变量是无法编译通过的,oh,原来是这么回事呢,这真是太神奇了,就是因为编程无奇不有,所以才有那么多人爱编程。

(5) 参数的引用;

application.properties中的各个参数之间也可以直接引用来使用,就像下面的设置:

  1. com.kfit.blog.desc=${com.kfit.blog.name}正在写《${com.kfit.blog.title}》

这个就很好理解了,使用${key} 的方式进行引用。

(6) 随机数;

在一些情况下,有些参数我们需要希望它不是一个固定的值,比如密钥、服务端口等。Spring Boot的属性配置文件中可以通过${random}来产生int值、long值或者string字符串,来支持属性的随机值。

  1. # 随机字符串
  2. com.kfit.blog.value=${random.value}
  3. # 随机int
  4. com.kfit.blog.number=${random.int}
  5. # 随机long
  6. com.kfit.blog.bignumber=${random.long}
  7. # 10以内的随机数
  8. com.kfit.blog.test1=${random.int(10)}
  9. # 10-20的随机数
  10. com.kfit.blog.test2=${random.int[10,20]}

好了,这些在之前的文章都有介绍过了,就不多说了。

(7) 使用自定义的配置文件company.properties怎么操作;

如果我们自己定义一个company.properties文件,

  1. #key = value的形式;
  2. filePathLocation = d:/data/files
  3. #公司简称;
  4. com.kfit.company.name =知远信科-custom
  5. #公司位置;
  6. com.kfit.company.location =北京海淀区-custom
  7. #公司联系方式;
  8. com.kfit.company.mobile = 110****1195-custom
  9. #公司员工人数;
  10. com.kfit.company.employCount = 100
  11. # 员工列表
  12. com.kfit.company.employs[0]=张三-custom
  13. com.kfit.company.employs[1]=李四-custom
  14. com.kfit.company.employs[2]=王五-custom
  15. com.kfit.company.firstName = lin-custom
  16. com.kfit.company.logo-path = d:/data/files/logo.png-custom
  17. com.kfit.company.COMPANY_FULLNAME =北京知远科技公司-custom

这个定义就是我们刚刚提到的一些配置,那么怎么引入了,如果使用上面的CompanyProperties的方式肯定是不行了,那么怎么呢?其实很简单,只需要在CompanyProperties稍微修改下即可,修改的地方如下:

  1. @ConfigurationProperties(
  2. prefix = "com.kfit.company",
  3. locations="classpath:company.properties")

大家注意,这里唯一不一样的地方是加入了一个属性locations指定了我们要使用的配置文件路径和名称,如果我们的配置文件不在application.properties下,可以这么定义:

classpath:config/company.properties。

好了这一个知识点就这么简单,只要掌握要点,一句代码就可以搞定。

(8) 在方法上使用@Bean的时候如何进行注入;

这个需求点是怎么产生的呢?我们经常会配置多个数据源,那么我们有些配置还是希望从application.properties文件中进行读取,那么自然而然的在我们定义的@bean中就需要能够读取配置文件的属性。这里我们简单做个试验,我们定义CompanyProperties3,具体代码如下:

  1. package com.kfit.properties;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class CompanyProperties3 {
  5. private String name;
  6. private String location;
  7. private String mobile;
  8. private int employCount;
  9. //对应:com.kfit.company.firstName = lin
  10. private String firstName;
  11. //对应:com.kfit.company.logo-path = d:/data/files/logo.png
  12. private String logoPath;
  13. //对应:com.kfit.company.COMPANY_FULLNAME = 北京知远科技公司
  14. private String companyFullname;
  15. private List<String> employs = new ArrayList<String>();
  16. public String getFirstName() {
  17. return firstName;
  18. }
  19. public void setFirstName(String firstName) {
  20. this.firstName = firstName;
  21. }
  22. public String getLogoPath() {
  23. return logoPath;
  24. }
  25. public void setLogoPath(String logoPath) {
  26. this.logoPath = logoPath;
  27. }
  28. public String getCompanyFullname() {
  29. return companyFullname;
  30. }
  31. public void setCompanyFullname(String companyFullname) {
  32. this.companyFullname = companyFullname;
  33. }
  34. public List<String> getEmploys() {
  35. return employs;
  36. }
  37. public void setEmploys(List<String> employs) {
  38. this.employs = employs;
  39. }
  40. public String getName() {
  41. return name;
  42. }
  43. public void setName(String name) {
  44. this.name = name;
  45. }
  46. public String getLocation() {
  47. return location;
  48. }
  49. public void setLocation(String location) {
  50. this.location = location;
  51. }
  52. public String getMobile() {
  53. return mobile;
  54. }
  55. public void setMobile(String mobile) {
  56. this.mobile = mobile;
  57. }
  58. public int getEmployCount() {
  59. return employCount;
  60. }
  61. public void setEmployCount(intemployCount) {
  62. this.employCount = employCount;
  63. }
  64. @Override
  65. public String toString() {
  66. return "CompanyProperties [name=" + name + ", location=" + location + ", mobile=" + mobile + ", employCount="
  67. + employCount + ", firstName=" + firstName + ", logoPath=" + logoPath + ", companyFullname="
  68. + companyFullname + ", employs=" + employs + "]";
  69. }
  70. }

注意这里的代码和以上不一样的是类上的注解全没有了,之后我们在App.java启动类中或者其它的类也是可以的,使用@Bean的方式进行注入。

@Bean

@ConfigurationProperties(prefix = "com.kfit.company")

public CompanyProperties3 companyProperties3(){

returnnew CompanyProperties3();

}

那么在其它的类中我们就使用@Autowired进行注入使用了,如下:

  1. @Autowired
  2. private CompanyProperties3 companyProperties3;

是不是很好玩呢。

(9) 自定义结构;

对于复杂的配置或嵌套的kv,我们可以编写自定义结构属性以更好的方式进行管理。

比如我们在application.properties文件中有如下信息:

  1. com.kfit.employForzs.name =张三
  2. com.kfit.employForzs.age = 20
  3. com.kfit.employForzs.gender =男
  4. com.kfit.employForls.name =李四
  5. com.kfit.employForls.age = 25
  6. com.kfit.employForzs.gender =女

com.kfit.properties.CompanyEmployee的代码如下:

  1. package com.kfit.properties;
  2. import org.springframework.boot.context.properties.ConfigurationProperties;
  3. import org.springframework.stereotype.Component;
  4. //prefix设置key的前缀;
  5. @ConfigurationProperties(prefix = "com.kfit")
  6. @Component
  7. public class CompanyEmployee {
  8. private CompanyEmployeeInfo employForzs;
  9. private CompanyEmployeeInfo employForls;
  10. public CompanyEmployeeInfo getEmployForzs() {
  11. return employForzs;
  12. }
  13. publicvoid setEmployForzs(CompanyEmployeeInfo employForzs) {
  14. this.employForzs = employForzs;
  15. }
  16. public CompanyEmployeeInfo getEmployForls() {
  17. return employForls;
  18. }
  19. publicvoid setEmployForls(CompanyEmployeeInfo employForls) {
  20. this.employForls = employForls;
  21. }
  22. public static class CompanyEmployeeInfo {
  23. private String name;
  24. private int age;
  25. private String gender;
  26. public String getName() {
  27. return name;
  28. }
  29. publicvoid setName(String name) {
  30. this.name = name;
  31. }
  32. public int getAge() {
  33. return age;
  34. }
  35. public void setAge(intage) {
  36. this.age = age;
  37. }
  38. public String getGender() {
  39. returngender;
  40. }
  41. public void setGender(String gender) {
  42. this.gender = gender;
  43. }
  44. @Override
  45. public String toString() {
  46. return "EmployForzs [name=" + name + ", age=" + age + ", gender=" + gender + "]";
  47. }
  48. }
  49. @Override
  50. public String toString() {
  51. return "CompanyEmployee [employForzs=" + employForzs + ", employForls=" + employForls + "]";
  52. }
  53. }

观察以上的代码我们定义了一个内部静态类进行处理相同的属性,那么在外部类中定义两个变量进行接收application.properties文件中的配置信息。

之后在其它类就可以使用@Autowired进行注入使用了。

(10) 校验;

当我们使用@ConfigurationProperties的时候,我们希望对一些参数进行校验,比如有些参数为空或者数字超出的限制就抛出异常信息,那么这个怎么操作呢?

在application.properties文件中加入:

com.kfit.company.url = http://www.kfit.com

在CompanyProperties类中加入:

@URL

private String url;

这里使用了@URL对url进行校验,如果是非法的url在启动的时候是会抛出异常信息的。

其中@URL对应的包路径为:org.hibernate.validator.constraints.URL

那么还有其它的什么校验器呢?看下文:

@Max(value = 99)

private int employCount;

定义最大值只能是99,那么如果运行的话,显然就会报错了,因为之前我们配置的值是100,那么就会看到控制台抛出异常信息:

default message [最大不能超过99]

这里只是截取了一小部分异常信息,具体的异常信息是可以参数那个参数的设置有问题的。

既然有最大值就有最小值的配置:

@Max(value = 1000)

@Min(value = 1)

private int employCount;

接着往下看:

@NotNull

private String name;

@NotNull说明name不能为null,如果为null就抛出异常。

接着往下看:

@NotEmpty

private String location;

@NotEmpty不能为空,当没有定义key和key的值为空字符的时候都会抛出异常信息。

在validation-api下包javax.validation.constraints下还有其它的校验器,大家可以根据需要自行学习。当然校验器是可以自定定义的,大家可以自己在扩展下,好了这个章节就介绍到这里了。

博客原文:http://412887952-qq-com.iteye.com/blog/2311017

170720、springboot编程之properties文件讲解的更多相关文章

  1. SpringBoot读取application.properties文件

    http://blog.csdn.net/cloume/article/details/52538626 Spring Boot中使用自定义的properties Spring Boot的applic ...

  2. SpringBoot @Value读取properties文件的属性

    SpringBoot在application.properties文件中,可以自定义属性. 在properties文件中如下示: #自定义属性 mail.fromMail.addr=lgr@163.c ...

  3. SpringBoot的读取properties文件的方式

    转载:https://www.imooc.com/article/18252一.@ConfigurationProperties方式 自定义配置类:PropertiesConfig.java pack ...

  4. 170622、springboot编程之JPA操作数据库

    JPA操作数据库 什么事JAP?JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中. 1.在pom ...

  5. android网络编程之HttpUrlConnection的讲解--实现文件的断点上传

    1.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android.permission.INTERNET"/& ...

  6. android网络编程之HttpUrlConnection的讲解--实现文件断点下载

    1.没有实现服务器端,下载地址为网上的一个下载链接. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android. ...

  7. android网络编程之HttpUrlConnection的讲解--上传大文件

    1.服务器后台使用Servlet开发,这里不再介绍. 2.网络开发不要忘记在配置文件中添加访问网络的权限 <uses-permission android:name="android. ...

  8. 170717、springboot编程之mybatis数据库开发和aop拦截

    一.springboot整合mybaits (1)新建maven project; 新建一个maven project,取名为:spring-boot-mybatis (2)在pom.xml文件中引入 ...

  9. SpringBoot中自定义properties文件配置参数并带有输入提示

    1. 创建配置类 在项目中创建一个参数映射类如下 @ConfigurationProperties(prefix = "user.info") public class MyPro ...

随机推荐

  1. RunnableException与CheckedException

    Checked Exception 编译时异常 编译的时候检查你的代码可能在运行的时候抛出异常,这通常在编译的时候要去处理的. RunnableException 运行时异常,可以编译通过,但如果不处 ...

  2. 用C语言显示汉字的演示程序

    汉字是方块字,宽高相等的汉字库在嵌入式领域有着广泛的应用,且其解析也相对来说是比较简单的.汉字在汉字库中的索引一般会遵循GB2312/GBK编码规则,GB2312/GBK规定汉字编码由2个字节组成,其 ...

  3. erlang和java的socket通讯----最简单,初次实现。

    直接上源码,留做纪念. 有点简单,大家不要笑,初次实现. 功能描述:java发送数据给erlang,erlang将收到的数据重复两次再发送给java. erlang源码:模块tcp_listen -m ...

  4. Unity中坐标系转换方法

    前言 本篇文章主要是参考<Unity API 解析>---陈泉宏. 这是本人在学校图书馆找到一本书,主要介绍的就是常用的类,比较实用,没有冗余的地方.在此推荐一下这本书! 一.Screen ...

  5. c++ 静态成员变量

    在C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用.所以在所有对象中都可以共享它.使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏的原则,保证了安全性还可以节 ...

  6. 单例模式(singleton pattern)--------创造型模式

    缺点: 1.单例模式没有抽象层,单例模式的扩展较困那(开闭原则) 2.单例类的职责过重,既提供了业务方法,又提供了创建对象的方法,将对象的创建和对象本身的功能耦合在一起(违反单一职责原则,但是似乎又无 ...

  7. PureMVC--一款多平台MVC框架

    官网:http://puremvc.org/ 下载:https://github.com/PureMVC/puremvc-csharp-multicore-framework/tree/1.1.0 A ...

  8. HEVC有损优化二

    1 .  HEVC有很些设置对速度的提升有很大的帮助,比如m_bUseEarlyCU,m_useEarlySkipDetection等. 把它们设置成true,会有意想不到的效果. 比如对于不同分辨率 ...

  9. supervisorctl unix:///var/run/supervisor.sock refused connection

    运行supervisorct 报如下错误 supervisorctl unix:///var/run/supervisor.sock refused connection 查看supervisord. ...

  10. QQ第三方登录实例demo(QQSDK包优化)

    实现效果: 实现流程: 1.注冊QQ互联开发人员 QQ互联官网 注冊成为开发人员(须要审核) 2.审核通过之后 申请应用(须要互联人员审核*须要备案成功的线上域名) 以下我们開始下载QQsdk包 QQ ...