一.背景
Springboot通过@Value注解会将properties/yml文件中的属性注入到容器内组件中,而在我们的工具类中并不是spring的组件,因此在工具类中直接使用@Value的时候会为null,所以需要做特殊处理。
小知识:@Value是在spring注入该类的默认构造器(即无参构造),再进行注入的
二.解决方案
1.自定义一个组件
@Component
public class Test {
//@Value只能给普通变量注入值,不能给静态变量赋值,不能直接在这里写@Value
public static String address;
@Value("${server.port}")
public void setAddress(String address) {
Test.address = address;
}
}
2.在工具类中直接调用这个类的属性
public class Test2 {
public String getValue() {
return Test.address;
}
}
然后在实例化Test2的时候,调用getValue方法是可以拿到返回值的。
结论:@Comment组件在springboot启动的时候就被扫描到,并且@Value实现注入,相当于将address获取到的值传给Test类中的属性,因此可以在工具类中,直接调用这个类的属性,获取到@Value取到的值。
另一种写法,容器初始化的时候给静态属性赋值,这个同样可以在工具类中直接引用Test.ADDRESS
@Component
public class Test implements InitializingBean{
public static String ADDRESS;
@Value("${server.port}")
public String address;
@Override
public void afterPropertiesSet() throws Exception {
ADDRESS = address;
}
}