Spring Boot @Value 在 @Bean 中为nul

2017-09-04  本文已影响0人  妖云小离

问题出现前

最近想把旧的用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下的方法直接使用了成员变量

一般用法.png

但是这似乎给了我们一个误导,只需要在成员变量上加上@Value就可是获取到配置文件里配置信息了。

问题出现中

于是我依葫芦画瓢,配置了一个ActiveMQ的连接工厂:

ActiveMQConnectionFactory.png

然后运行时报Null错误,三个成员变量都为null

问题出现后

问题解决

我在百度“@Value 无效”的一堆结果中,发现了一种把@Value写在方法的参数里的用法:

ActiveMQConnectionFactory.png

这不是换了个角度,把我的问题解决了嘛??测试后果然成功了

那么为什么JedisPool可以这么写,我自己的配置信息就不行呢?
我猜想,对于starter的配置信息,spring回去优先赋值给加上@Value的变量,再去加载Bean。然后对于自己写的配置信息,会在所有Bean加载完之后再去赋值?

上一篇 下一篇

猜你喜欢

热点阅读