使用@ConfigurationProperties实现类型安全的配置过程
作者:思影影思 发布时间:2023-07-01 00:26:05
@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();
}
}
来源:https://blog.csdn.net/lk142500/article/details/88932610


猜你喜欢
- 健康检查是Spring Boot Actuator中重要端点之一,可以非常容易查看应用运行至状态。本文在前文的基础上介绍如何自定义健康检查。
- 这个问题来来回回困扰了我很久,一直没能妥善解决。场景1:华为手机遮挡了屏幕底部。场景2:进入应用时,虚拟键自动缩回,留下空白区域。需求:需要
- 如果有一个值不太会变化,我们经常使用const和readonly,这2者有何不同呢?有时候,我们也会在readonly之前加上关键字stat
- 目录1、设Tree为已定义的类名,下列语句能正确创建 Tree 对象的是 。2、区分类中重载方法的依据是( )。3、以下代码执行后输出结果为
- 前言文章开始把我喜欢的这句话送个大家:这个世界上还有什么比自己写的代码运行在一亿人的电脑上更酷的事情吗,如果有那就是让这个数字再扩大十倍!!
- 大叔我北漂十多年,一直没有摇到北京的车牌,每周都需要通过一个 APP 办理“进京证”,当我办理 19 年最后一次进京证的时候,APP 给出了
- Android Fragment滑动组件ViewPager的实例详解1适配器FragmentPagerAdapter的实现对于Fragmen
- 前言想在锁屏上面实现弹窗,第一个想法就是利用 WindowManager 设置 Window 的 Flag,通过设置 Flag 的显示优先级
- Activity非异常情况下的生命周期是指,用户正常参与UI交互的情况下,Activity所经过的生命周期的改变;一般情况下,Activit
- 匿名类类型类可以是匿名的 - 也就是说,可以在没有 identifier 的情况下声明类。在将类名称替换为 typedef 名称时,这会很有
- 直接来,ResponseDemo1代码,get请求到post请求,重定向到ResponseDemo2我的虚拟目录为ResponseDemo1
- 一、maven项目的目录结构pom文件定于了一个maven项目的maven配置,一般pom文件的放在项目或者模块的根目录下。maven的遵循
- 本方式可以获得内部存储设备地址、SD卡地址、USB设备地址,兼容性能达到99%(别问我为什么这么保证,因为是借鉴了Android设置->
- 一、BIO、NIO、AIO学习Netty需要了解BIO、NIO、AIO,具体可参考Java网络编程IO模型 — BIO、
- 一、背景介绍最近在项目中遇到一个需求,实现一个后台拍照的功能。一开始在网上寻找解决方案,也尝试了很多种实现方式,都没有满意的方案。不过确定了
- 前言自 Java 7 以来,java 中的 switch 语句经历了快速发展。因此,在本文中,我们将通过示例讨论 switch 语句从 ja
- 一.起缘故事缘于一位朋友的一道题:朋友四人玩LOL游戏。第一局,分别选择位置:中单,上单,ADC,辅助;第二局新加入的伙伴要选上单,四人可选
- 本文实例分析了Android编程之TextView的字符过滤功能。分享给大家供大家参考,具体如下:TextView可以设置接受各式各样的字符
- Android 自定义按钮点击事件和长按事件对比一个按钮同时实现点击和长按事件,有时候会有冲突,我们针对这一现象来自定义按钮来区
- 使用Kotlin的Lambda表达式,我们可以抛弃回调接口的使用。只需设置希望后面会被调用的函数即可。示例如下新建一个Kotlin类clas