Java web开发总结

UC web开发总结

  • 1、 Spring 中 @Value 在 @Bean 中为null的问题、@Value给static静态变量赋值为null
    • 问题出现前
    • 问题出现中
    • 问题出现后
    • 问题解决

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加载完之后再去赋值?

你可能感兴趣的:(uc技术文档)