Spring Boot @Value 在 @Bean 中为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下的方法直接使用了成员变量

Spring Boot @Value 在 @Bean 中为null的问题_第1张图片
一般用法.png

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

问题出现中

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

Spring Boot @Value 在 @Bean 中为null的问题_第2张图片
ActiveMQConnectionFactory.png

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

问题出现后

  • 是不是配置文件的路径没有配置?
    在配置类上加注解@PropertySource(value = "classpath:/application.properties")依旧报错

  • 是不是加载Bean之前,@Value还没给成员变量赋值?
    应该是这个问题没错,于是我给成员变量加上static关键字,依旧报错。
    那现在问题变成了,怎么先让成员变量赋值,再让spring加载Bean呢?

问题解决

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

Spring Boot @Value 在 @Bean 中为null的问题_第3张图片
ActiveMQConnectionFactory.png

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

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

你可能感兴趣的:(Spring Boot @Value 在 @Bean 中为null的问题)