1、 Spring 中 @Value 在 @Bean 中为null的问题、@Value给static静态变量赋值为null
问题出现前
最近想把旧的用SSM框架的项目改为用SpringBoot。
于是乎,需要把XML配置的文件用@Configuration注解类来替换。
拿配置JedisPool来当例子
@Configuration
public class JedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.timeout}")
private int timeout;
@Value("${spring.redis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.pool.max-wait}")
private long maxWaitMillis;
@Value("${spring.redis.password}")
private String password;
@Bean
public JedisPool redisPoolFactory() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMaxWaitMillis(maxWaitMillis);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout);
return jedisPool;
}
}
其中@Value加在了成员变量上面
在@Bean下的方法直接使用了成员变量
但是这似乎给了我们一个误导,只需要在成员变量上加上@Value就可是获取到配置文件里配置信息了。
问题出现中
于是我依葫芦画瓢,写了一个service类:
@Value("${sendsms.min.internal}")//默认短信时间间隔
private Long sendSMSInternal;
@Value("${sendsms.times.expire}")//redis缓存失效时间(注:短信发送次数)
private Long sendSMStimes;
@Value("${reg.debuguser.uidlist}")
private String regDebuguserUidList;
@Value("${reg.debuguser.fixSentNum:888888}")
private Integer regDebuguserFixSendNum;
@Value("${debugMode}")
private Boolean debugMode;
@Value("${repost.uc.host}")
private String repostUcHost;
@Value("${pool.size:#{4}}")
private Integer poolSize;
// private final static Integer poolSize = 4;
private HttpClientProvider httpProv = new HttpClientProvider();
private ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(poolSize);
启动springboot报空指针异常,debugger模式下,然后运行时报Null错误,所以@Value的成员变量都为null。
问题出现后
是不是配置文件的路径没有配置?
在配置类上加注解@PropertySource(value = “classpath:/application.properties”)依旧报错
是不是加载Bean之前,@Value还没给成员变量赋值?
应该是这个问题没错,于是我给成员变量加上static关键字,依旧报错。
那现在问题变成了,怎么先让成员变量赋值,再让spring加载Bean呢?
问题解决
我在百度“@Value 无效”的一堆结果中,于是发现了一种把@Value写在方法的参数里的用法:
那这不是换了个角度,把我的问题解决了嘛??测试后果然成功了
那么为什么JedisPool可以这么写,我自己的配置信息就不行呢?
我猜想,对于starter的配置信息,spring会去优先赋值给加上@Value的变量,再去加载Bean。然后对于自己写的配置信息,会在所有Bean加载完之后再去赋值?
。