@Value配置正确,但是一直加载为null导致服务启动失败的问题

    @Value("${save-db.nanchang-batch-size:100}")
    private int batchSize;
    @Value("${save-db.blocking-queue-size:30000}")
    private int blockingQueueSize;
    @Value("${save-db.flush-interval:3000}") 
    private int flushInterval

    private BlockingQueue<SmsTask> messageQueue = new LinkedBlockingQueue<>(blockingQueueSize);
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    public SmsHandler() {
        channelCode = ChannelType.SMS.getCodeEn();
        // 启动定时任务,定期执行批处理
        log.info("启动短信发送定时任务:{}", flushInterval);
        scheduler.scheduleAtFixedRate(this::flushBatch, flushInterval, flushInterval, TimeUnit.MILLISECONDS);
    }

问题

确定我的配置正确,但是启动服务的时候始终报这几个参数都是null,哪怕给了默认值都是null,开启debug模式,发现是加载顺序问题,类的字段初始化、构造函数初始化时间点都在@Value之前,所以就有这个问题,解决方案如下:

    @Value("${save-db.nanchang-batch-size:100}")
    private int batchSize;
    @Value("${save-db.blocking-queue-size:30000}")
    private int blockingQueueSize;
    private BlockingQueue<SmsTask> messageQueue;

    @PostConstruct
    public void init() {
        messageQueue = new LinkedBlockingQueue<>(blockingQueueSize);
    }
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public SmsHandler(@Value("${save-db.flush-interval:3000}") int flushInterval) {
        log.info("启动短信发送定时任务:{}", flushInterval);
        scheduler.scheduleAtFixedRate(this::flushBatch, flushInterval, flushInterval, TimeUnit.MILLISECONDS);
    }

总结

Spring的依赖注入机制决定了@Value的注入发生在bean的构造函数执行之后。因此,在构造函数或字段初始化时直接使用@Value注入的值会导致null值。通过将初始化逻辑放到@PostConstruct方法中、使用构造函数注入,或者使用@ConfigurationProperties绑定配置属性,可以有效解决这个问题。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.1 spring IoC容器和beans的简介 Spring 框架的最核心基础的功能是IoC(控制反转)容器,...
    simoscode阅读 11,720评论 2 22
  • 1.1 Spring IoC容器和bean简介 本章介绍了Spring Framework实现的控制反转(IoC)...
    起名真是难阅读 7,429评论 0 8
  • 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升...
    timothyue1阅读 2,755评论 0 1
  • 本来是准备看一看Spring源码的。然后在知乎上看到来一个帖子,说有一群**自己连Spring官方文档都没有完全读...
    此鱼不得水阅读 11,838评论 4 21
  • 转 Spring****基于 Annotation 的简单介绍 2011年03月29日 15:07:00 阅读数:...
    fd649cf896c0阅读 2,790评论 1 0

友情链接更多精彩内容