背景
网上众多文章都描述了 @ConfigurationProperties(prefix = "xxx")
和 @Value("${xxxx}")
的如何使用,但是这些文章大部分都是讲述的一个配置项对应一个类对象属性。 当我看到Zuul的配置文件及其路由规则的时候,产生了一个疑问,为什么可以只增加路由规则就可以实现路由了,难道不应该对应增加类的属性来接收吗? 这个问题我没有在网上搜到答案,于是仔细的查看Zuul的配置类,终于找到答案,本文主要针对这个问题来讲述。
小小铺垫
-
@Configuration
该注解会将标注的类交由 Spring 容器管理,一般标注在配置类上 -
@ConfigurationProperties
该注解用来描述被标注的类的配置项,常常用来指定前缀和指定配置文件路径,简化配置类的属性名定义
@Configuration
@ConfigurationProperties(prefix = "mail")
public class MailProperties {
public static class Smtp {
private boolean auth;
private boolean starttlsEnable;
// ... getters and setters
}
private String host;
private int port;
private String from;
private String username;
private String password;
private Smtp smtp;
// ... getters and setters
}
application.properties
文件内容为
mail.host=localhost
mail.port=25
mail.smtp.auth=false
mail.smtp.starttls-enable=false
mail.from=hello@localhost
mail.username=aaaa
mail.password=aaaa
通过其上两段代码,就可以知道其配置规则是根据属性名来进行匹配。
问题来了
- 上面代码我们知道是定义发送Email的配置,假设该功能在微服务中,那么有一个需求就是该微服务应该提供账号和密码来分别发送不同业务服务的邮件。根据上面了解到的知识,貌似我们只能定义多个
username
、password
属性来区分,这样的话如果新增一个业务服务那么就会造成相当大的影响。 - 下面就要讲到我们在文中开头提的问题了,
如何添加配置项而不需要增加对应的类对象属性的定义
代码说明
MailProperties
改成:
@Configuration
@ConfigurationProperties(prefix = "mail")
public class MailProperties {
public static class Smtp {
private boolean auth;
private boolean starttlsEnable;
// ... getters and setters
}
private String host;
private int port;
private String from;
// 改动在此处
private Map username;
private Map password;
private Smtp smtp;
// ... getters and setters
}
application.properties
文件内容改为
mail.host=localhost
mail.port=25
mail.smtp.auth=false
mail.smtp.starttls-enable=false
mail.from=hello@localhost
mail.username.order-service=aaaa
mail.password.order-service=aaaa
//如果新增一个用户服务来发送邮件,那么新增下面配置
mail.username.user-service=bbbb
mail.password.user-service=bbbb
配置完成后,MailProperties
中的 username
的 key
为 order-servcie 和 user-service, value
分别对应aaaa
和 bbbb
, password
类似
- 相信看到大家都已经理解是如何配置的了,具体的装配细节在
spring-beans
包中,本文不展开说了。
代码体验
- 本文内容提供了demo供大家了解体验
-
github
地址: https://github.com/vincent-ren/SCLeanning
操作流程
- 拉取git仓库
- 找到
configuration-demo
工程,切换至其pom.xml
文件下 - 编译打包:
mvn clean package
- 启动项目:
java -jar target/configuration-demo-0.0.1-SNAPSHOT.war
- 项目启动在8080端口,浏览器输入:
http://localhost:8080/test/{serviceName}
serviceName
为配置中获取 username
和 password
的 key
, 根据配置文件的定义,输入user-service
会显示userName is: bbbb, password is: bbbb
,大家可以自己修改配置文件,来进行体验。
总结
本文主要说明的是介绍如何定义属性为Map类型的配置类,个人感觉这个还是一个比较有实用性的知识点,所以分享出来,欢迎有更多见解的朋友来进行交流。
参考文章:http://www.jianshu.com/p/df57fefe0ab7