spring boot 将配置文件信息 赋值到类注解

news/2024/9/23 7:29:27/

如何将application.properties中的值赋值给一个类注解呢

先看两个类
application.properties

server.port=8080
flow.name=myFlow
flow.age=20
@Component
@Documented
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface UserInfo {String name() default "";String age() default "18";}

我们现在将application.properties中的flow.name和flow.age赋值到UserInfo注解的name和age中,应该怎么做呢?具体见下面代码,
先定义一个User类获取properties里面的值

@Configuration
public class User {private String name;private String age;public String getName() {return name;}@Value("${flow.name}")public void setName(String name) {this.name = name;}public String getAge() {return age;}@Value("${flow.age}")public void setAge(String age) {this.age = age;}public User() {}public User(String name, String age) {this.name = name;this.age = age;}
}

然后我们再需要用这个类的地方这样写

@UserInfo(name = "@user.name", age = "@user.age")
@Service
public class UserServiceImpl implements UserService {
}

最后我们定义一个配置文件实现BeanPostProcessor 接口

@Service
public class UserConfig implements BeanPostProcessor {@Autowiredprivate BeanFactory beanFactory;@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) {UserInfo userInfo = bean.getClass().getAnnotation(UserInfo.class);if (userInfo != null) {String name = userInfo.name();String age = userInfo.age();System.out.println("name:" + name + ",age:" + age);SpelExpressionParser spelExpressionParser = new SpelExpressionParser();StandardEvaluationContext standardEvaluationContext = new StandardEvaluationContext();standardEvaluationContext.setBeanResolver(new BeanFactoryResolver(beanFactory));String value1 = spelExpressionParser.parseExpression(name).getValue(standardEvaluationContext, String.class);String value2 = spelExpressionParser.parseExpression(age).getValue(standardEvaluationContext, String.class);System.out.println("value1:" + value1 + ",value2:" + value2);}// 在初始化之前执行的逻辑return bean;}
}

实现BeanPostProcessor 接口并重写postProcessBeforeInitialization()方法然后在里面解析这两个属性
使用spel解析器就可以把值解析出来。这样我们就可以将解析后的值随便赋值了,我们启动看看效果。

name:@user.name,age:@user.age
value1:myFlow,value2:20

可以看到值成功取到了


http://www.ppmy.cn/news/1443747.html

相关文章

C++ //练习 13.54 如果我们为HasPtr定义了移动赋值运算符,但未改变拷贝并交换运算符,会发生什么?编写代码验证你的答案。

C Primer(第5版) 练习 13.54 练习 13.54 如果我们为HasPtr定义了移动赋值运算符,但未改变拷贝并交换运算符,会发生什么?编写代码验证你的答案。 环境:Linux Ubuntu(云服务器) 工具…

【HTML】实现 pre 标签内容超出自动换行

文章目录 示例&#xff1a; <pre> 一串很长的文本&#xff0c;一串很长的文本&#xff0c;一串很长的文本&#xff0c;一串很长的文本&#xff0c;一串很长的文本&#xff0c;一串很长的文本&#xff0c;一串很长的文本&#xff0c;一串很长的文本&#xff0c;一串很长的…

深度学习检测算法YOLOv5的实战应用

在当前的检测项目中&#xff0c;需要一个高效且准确的算法来处理大量的图像数据。经过一番研究和比较&#xff0c;初步选择了YOLOv5作为算法工具。YOLOv5是一个基于深度学习的检测算法&#xff0c;以其快速和准确而闻名。它不仅能够快速处理图像数据&#xff0c;还能提供较高的…

ArcGIS无法开始编辑TIN!开始编辑TIN显示灰色

ArcGIS无法开始编辑TIN&#xff01;开始编辑TIN显示灰色&#xff1f; 解决方案&#xff01; 1、确认自定义——扩展模块中空间分析、3D分析模块勾选。 2、确认以上后&#xff0c;还是不能编辑的话&#xff0c;我们可以调出 3D分析分析工具条&#xff0c;你就会发现。TIN编辑工…

个人学习总结__打开摄像头、播放网络视频的以及ffmpeg推流

前言 最近入手了一款非常便宜的usb摄像头&#xff08;买回来感觉画质很低&#xff0c;没有描述的4k&#xff0c;不过也够用于学习了&#xff09;,想着利用它来开启流媒体相关技术的学习。第一步便是打开摄像头&#xff0c;从而才能够对它进行一系列后续操作&#xff0c;诸如实…

【数据结构与算法设计】知识点复习-第五章-树形结构

1. 树 树是数据元素之间具有层次关系的非线性结构&#xff0c;是由n个结点构成的有限集合&#xff0c;结点数为0的树叫空树。树必须满足以下条件。 (1) 有且仅有一个被称为根的结点。 (2) 其余结点可分为m个互不相交的有限集合&#xff0c;每个集合又构成一棵树&#xff0c;叫…

vue2集成ElementUI编写登录页面

目录 1. 整理目录文件&#xff1a; a. app.vue文件如下&#xff1a; b. Login.vue文件如下&#xff1a; c. router/index.js文件如下&#xff1a; d. 删除components中的文件&#xff1a; e. 最终项目目录整理如下&#xff1a; 2. 集成ElementUI编写登录页面 a. 安装El…

C#中=> “Lambda运算符”

在C#中&#xff0c;> 符号被称为“Lambda运算符”或“Lambda箭头”。它用于连接Lambda表达式中的参数列表和表达式主体&#xff0c;表示函数的输入和输出关系。因此&#xff0c;Lambda运算符充当了将参数映射到表达式的箭头。 Lambda运算符的左侧是参数列表&#xff0c;它们…