@Value无法注入static属性
项目框架SSM。
当时为了给一个功能实现可配置化,就将数据放到了 application.properties 配置文件中,然后通过 @value
来读取数数据。
但是我想要的效果是配置一个Integer类型的数组,当时的配置内容类似这么写的:
jobType=1,2,3
读取数据注入代码这么写的:
@Value("${jobType}")
private Integer[] jobType;
在springboot中测试效果是可以的,但放到SSM中就不行了,这也许是springboot和spring的一个差别。
后来经过测试,发现spring对于包含标点等符号字符的只支持使用String来接收,也可以使用String[]接收,但是这样也只有一个元素。
为了实现我想要的效果,处理过程变成:
1、先使用String类型来接收 @Value读取的数据
2、对读取的数据按照,
英文逗号分割,使其变成一个数组
功能是实现了,但是这样的有一个不足:
每进行一次业务操作都会对数据做一个分割处理。
为什么说不足呢?因为配置的数据服务启动不会不会再变更,且处理的逻辑都一样,可以说对字符串分割后的数据才是我们想要的数据。
那能不能在程序启动的时候,就初始化处理好,且只处理一次呢?
我想到了在类中使用static{}
但是静态方法中只有使用静态的变量。
所以我将数据读取变为:
@Value("${jobType}")
private static String jobType;
但是不管我使用spring还是springboot,程序读取的结果都是null。
经过资料查询:
原来jvm启动的时候会对class进行初始化,初始化的时候会执行里面的 static{}
,而使用@value
是将配置文件的数据作为一个bean注入到spring 容器中,什么时候用什么时候注入,且只会注入一次。
在执行static的时候,还没有创建spring 容器,也就无法读取数据到jobType变量中,也就导致每次读取的数据都是null的。
后来不使用static了,而是使用一个静态的数组来接收,每次业务处理之前,先判断数组是否为空,不为空直接使用,为空则进行一次赋值。
这类的问题,也有一些博客说明了,可以参考:
https://blog.csdn.net/sqlgao22/article/details/100096348