如何将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
可以看到值成功取到了