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

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

先看两个类
application.properties

xml 复制代码
server.port=8080
flow.name=myFlow
flow.age=20
java 复制代码
@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里面的值

java 复制代码
@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;
    }
}

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

java 复制代码
@UserInfo(name = "@user.name", age = "@user.age")
@Service
public class UserServiceImpl implements UserService {
}

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

java 复制代码
@Service
public class UserConfig implements BeanPostProcessor {

    @Autowired
    private BeanFactory beanFactory;

    @Override
    public 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

可以看到值成功取到了

相关推荐
逻极5 分钟前
FastAPI 实战:从入门到自动化文档,如何把API开发效率提升200%
python·api·fastapi·swagger·异步
zzzzzz3107 分钟前
别让大模型直接碰业务:我在 Spring Boot 里给 AI 操作加了一道“可拒绝的闸门”
人工智能·spring boot·spring
techdashen20 分钟前
Go设计取舍之四: map不变时能否并发修改不同value
开发语言·后端·golang
知彼解己28 分钟前
Java 版本演进
java·开发语言·spring boot
半兽先生36 分钟前
大模型技术开发与应用——5.大模型Agent开发(CrewAI)
大数据·人工智能·python·机器学习·ai
眼泪划过的星空39 分钟前
快速了解LangGraph:构建智能Agent工作流的核心框架
人工智能·python·langchain
朱容zr3331331 小时前
为什么推荐使用自增主键?使用UUID作为主键的优缺点是什么?
java·运维·数据库·后端·mysql·面试·性能优化
用户608186527901 小时前
一文吃透 Avalonia 布局容器|Grid 到 UniformGrid 核心用法 + 语法糖实战
后端
IsSh9nj6q1 小时前
Python全栈应用搭建神器magic-dash .新版本介绍
开发语言·python·dash
Ai拆代码的曹操1 小时前
Dubbo 线程池爆满排坑:Linux 用户线程数限制,一个容易被忽略的根因
后端·源码阅读