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

可以看到值成功取到了

相关推荐
绘梨衣5479 分钟前
求助帖:pdf复杂表格解析
爬虫·python·pdf
从零开始的代码生活_11 分钟前
C++ 模板入门:函数模板、类模板与实例化机制
开发语言·c++·后端
充钱大佬9 小时前
Python测试基础教程
python·log4j·apache
mCell9 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
咖啡八杯9 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
初心丨哈士奇11 小时前
Python 四大基础容器|列表篇
python
明理的信封12 小时前
AI 基础设施的“去 Python 化“:Rust 与 C# 的两条替代路径
人工智能·python·rust
IT_陈寒13 小时前
SpringBoot自动配置不是你以为的那样的智能
前端·人工智能·后端
麻雀飞吧13 小时前
2026年AI量化开发,先跑通小流程再加复杂功能
人工智能·python
daphne odera�13 小时前
PyCharm 中 Codex 插件启动失败:unknown variant default 的解决方法
python·chatgpt·pycharm