使用@ConfigurationProperties实现类型安全的配置过程
作者:思影影思
@ConfigurationProperties实现类型安全的配置
问题描述
从之前@Value的使用,可以知道@Value可以灵活的把配置文件中的键值对的值注入到Bean中供我们使用,已经很灵活了,但这还不够,比如下述的application.properties
tomcat.ip=192.168.1.110 tomcat.port=8787 tomcat.projectName=screenshot tomcat.userName=admin tomcat.password=admin
如果也要按照之前的描述,使用@value就要填写5次,这显然令人惆怅,在程序员的世界里,所有重复性的工作都应该被取代,因此Spring Boot为我们提供了@ConfigurationProperties注解。
实践
application.properties
tomcat.ip=192.168.1.110 tomcat.port=8787 tomcat.projectName=screenshot
从上述的配置项中,可以看到明显的相似性,即这一簇配置均以tomcat开始,类似String类中的startWith函数。
核心代码
package com.wisely.ch6_2_3.config; import lombok.Getter; import lombok.Setter; import lombok.extern.log4j.Log4j; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "tomcat") //1 @Log4j public class TomcatSetting { @Getter @Setter private String ip; @Getter @Setter private int port; @Getter @Setter private String projectName; public String getUrl() { return "http://"+getIp()+"/"+getPort()+"/"+getProjectName(); } }
通过这种方法,即可实现一次性注入相似的配置,非常方便。
减少了重复性工作,即提高优雅度,也能减少错误,很酷。
关于ConfigurationProperties注解的说明
下文笔者讲述Spring Boot中ConfigurationProperties注解的相关说明
如下所示:
我们都知道在Spring中,可以使用@Value对单个属性进行注入配置操作
但是很多配置都具有一定的层级,那么此时Spring提供了一个基于层级配置的注解
如下所示:
@ConfigurationProperties注解的功能:
- 将properties属性和一个Bean及其属性关联
- 从而实现类型安全配置
例:
@ConfigurationProperties加载properties文件内的配置 使用prefix属性指定配置文件中定义的properties配置的统一前缀
@ConfigurationProperties(prefix = "remote"})
---Spring Boot1.5之前,使用以下配置指定properties文件的位置
@ConfigurationProperties(prefix = "remote",locations={"classpath:remote.properties"})
示例代码如下:
remote.address= www.java265.com remote.port= 9090 @Component @PropertySource({"classpath:remote.properties"}) @ConfigurationProperties(prefix = "remote") public class RemoteConfig { private String address; private int port; // getter/stetter方法 }
对应RemoteConfig的Bean的使用:
@RestController public class ConfigurationController { @Resource private RemoteConfig remoteConfig; @GetMapping public void getInfo() { System.out.println("地址:" + remoteConfig.getAddress()); System.out.println("端口:" + remoteConfig.getPort()); } } //测试 @SpringBootTest @AutoConfigureMockMvc class ConfigurationControllerTest { @Autowired private MockMvc mockMvc; @Test void getInfo() throws Exception { mockMvc.perform(MockMvcRequestBuilders.get("/")); } } -----运行以上代码,将输出以下信息------ 地址:www.java265.com 端口:9090
例:
@ConfigurationProperties注解应用于Bean方法上的示例分享
例:
@Configuration public class MyConfig { @Bean @ConfigurationProperties(prefix = "user") public User user() { return new User(); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。