springboot使⽤@value注⼊配置失败的解决
⽬录
springboot使⽤@value注⼊配置⽂件失败
问题解决⽅向⼀
问题解决⽅向⼆
@Value注⼊失败,注⼊值为null的问题
⼤概就是下⾯这样
结果不知道为什么,@Value注⼊⼀直为空??
原因如下
解决办法
springboot使⽤@value注⼊配置⽂件失败
遇到的问题原因是:类中注⼊对象不能⽤static。
问题解决⽅向⼀
1、改为如图⽰,去掉static
问题解决⽅向⼆
1、仍然定义静态变量,但在其set⽅法上使⽤@Value进⾏赋值
2、仍然定义静态变量,同时定义⼀个普通变量,使⽤@Value给普通变量赋值。定义⼀个⽅法,使⽤@PostConstruct注解注释⽅法,在这个⽅法⾥,会⾃动将注⼊的值赋值给定义的static变量
@Value注⼊失败,注⼊值为null的问题
今天在写项⽬的时候,因项⽬⾥的某个key是每个⼈都不⼀样,所以想到了在l⾥配置,随后使⽤@Value注⼊,不同⼈使⽤就只需要创建每个⼈的application⽂件就⾏了。
⼤概就是下⾯这样
@Value("${localhost-key}")
private static String key;
yml⾥:
localhost-key: abcd
结果不知道为什么,@Value注⼊⼀直为空??
很疑惑,检查了⼀下@Value并没有导错包,@Value("${localhost-key}")也没有写错,再仔细检查了⼀下Utils,发现没加
@Component
有点郁闷的,赶紧把@Component加上了:
@Component
public class FileUtils {
@Value("${localhost-key}")
private static String key;
}
再⼀运⾏,发现居然还是null
⼼⾥很疑惑,到底哪⾥出了问题,运⾏没有问题,也没有报错,感觉就是@Value的问题了。
⼀番查资料,⼜问了问学校的⽼师,终于明⽩:
@Value不能直接注⼊值给静态属性,Spring 不允许(或者说不⽀持)把值注⼊到静态变量中
原因如下
静态变量是⼀个类的属性,⽽不是对象的属性,但是Spring的依赖注⼊是基于对象层⾯上的。
⽽使⽤静态变量扩⼤了静态⽅法的使⽤范围,Spring是不推荐使⽤静态⽅法的,依赖注⼊的⽬的就是想让容器去产⽣⼀个对象的实例,然后在整个⽣命周期中使⽤他们。
⽽⼀旦使⽤静态⽅法,就不会去产⽣这个类的实例,这会让测试变得更加困难。同时也不能为⼀个给定的类,依靠注⼊⽅式去产⽣多个具有不同的依赖环境的实例。
这种静态域是隐含共享的,并且是⼀种全局状态,Spring同样不推荐这样去做。
spring boot原理和生命周期问题倒是到了,但是有没有解决的办法呢?⼜是⼀番寻之后
解决办法
Spring⽀持set⽅法注⼊,我们可以利⽤⾮静态Set⽅法注⼊静态变量,并且使⽤@Value的类必须交给spring进⾏管理(即类上添加@Compent、@RestController、@Service…)
@Component
public class FileUtils {
private static String key;
@Value("${localhost-key}")
public void setKey(String key) {    //注意这⾥的set⽅法不能是静态的
FileUtils.key = key;
}
}
再⼀运⾏,果然值就赋上了。
问题解决~
以上为个⼈经验,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。