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

server/2024/9/24 17:24:18/

如何将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/server/23179.html

相关文章

谷歌TPU(Tensor Processing Unit)

谷歌TPU(Tensor Processing Unit) https://cloud.google.com/tpu/docs/intro-to-tpu?hlzh-cn CPU的工作模式和GPU工作模式的区别 CPU 最大的优点是它们的灵活性。您可以在 CPU 上为许多不同类型的应用加载任何类型的软件。对于每次计算,CPU…

WPS-EXCEL:快速删除多个线条对象

问题图 我需要将线条快速删除 方法一:使用定位对象功能 使用定位功能:按Ctrl G打开定位对话框。在对话框中,点击“定位条件”。 定位对象:在定位条件对话框中,勾选“对象”选项,然后点击“确定”。这样,…

学习Python的第三天

学习Python的第三天,我开始深入Python的基本语法和特性,并通过编写一些简单的代码来加深理解。以下是我今天学习的一些代码案例: 1. 函数定义与调用 # 定义一个函数,计算两个数的和 def add_numbers(a, b):return a b# 调用函数…

企业微信hook接口协议,ipad协议http,发送小程序

发送小程序 参数名必选类型说明uuid是String每个实例的唯一标识,根据uuid操作具体企业微信send_userid是long要发送的人或群idisRoom是bool是否是群消息 请求示例 {"uuid":"543ed7f3-6ec1-4db8339a140f7","send_userid":788130255…

Eclipse内存分析器 Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用

1.visualvm实时监测 2.Memory Analyzer Tool打开 3.工具的使用可以参考 Java内存分析工具MAT(Memory Analyzer Tool)的介绍与使用 ------------------------ 1.我远程发现是其中一个客户端A请求服务器页面响应,一直得不到响应,然后客户端A一直请求&am…

[iOS]组件化开发

一、组件化开发基础 1.组件定义 在软件开发中,一个组件是指一个独立的、可替换的软件单元,它封装了一组相关的功能。组件通过定义的接口与外界交互,并且这些接口隔离了组件内部的实现细节。在Swift语言中,组件可以是一个模块、一…

ipad的文件如何传到手机里 iPad较大文件怎么发送出去 iMazing下载教程

在现代生活中,随着移动设备的普及和多样化,我们经常需要在不同设备之间传输文件,以便在工作、学习或娱乐中更加便捷地使用这些文件。iPad和iPhone是用户广泛使用的设备,我们时常使用它们来存储和访问大量的个人数据。但有时&#…

代码随想录算法训练营33期 第五十五天 | 392.判断子序列、115.不同的子序列

392.判断子序列 // dp[i][i] s[0到i-1]和s[0到j-1]的最大相同子序列长度 // if (s[i-1]t[j-1]) dp[i][j]dp[i-1][j-1]1; // else dp[i][j]dp[i][j-1];注意,我们只是在对比j中的情况,所以是j-1 // dp[0][0]0 class Solution { public:bool isSubsequence…