问题出现前
最近想把旧的用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就可是获取到配置文件里配置信息了。
问题出现中
于是我依葫芦画瓢,配置了一个ActiveMQ的连接工厂:
然后运行时报Null错误,三个成员变量都为null
问题出现后
是不是配置文件的路径没有配置?
在配置类上加注解@PropertySource(value = "classpath:/application.properties")依旧报错是不是加载Bean之前,@Value还没给成员变量赋值?
应该是这个问题没错,于是我给成员变量加上static关键字,依旧报错。
那现在问题变成了,怎么先让成员变量赋值,再让spring加载Bean呢?
问题解决
我在百度“@Value 无效”的一堆结果中,发现了一种把@Value写在方法的参数里的用法:
这不是换了个角度,把我的问题解决了嘛??测试后果然成功了
那么为什么JedisPool可以这么写,我自己的配置信息就不行呢?
我猜想,对于starter的配置信息,spring回去优先赋值给加上@Value的变量,再去加载Bean。然后对于自己写的配置信息,会在所有Bean加载完之后再去赋值?