@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

posted @ 2022-04-13 10:01  张志文的博客  阅读(407)  评论(0)    收藏  举报