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