Spring boot @Value 获取值为 null

记录踩过的坑
在Spring boot项目中我希望通过

private static final int availProcessors = Runtime.getRuntime().availableProcessors();
private ExecutorService ThreadPool = Executors.newFixedThreadPool(availProcessors >> 1);

构造的线程池来执行从kafka消息队列获取到参数后进行的处理逻辑,为了使用线程池当然要把处理逻辑写入一个继承了Runnable的方法中,然后通过

ThreadPool.execute();

来执行这个方法,这时候问题就来了。如果想要使用构造方法传递参数,那么不能使用类注解 (加上注解会报获取不了传入参数的问题)

@Service
和
@Component

而不加这两个注解,便不能使用spring的@Value注解类获取配置文件的值,并且@Autowired 注解也不会生效, 也就是直接脱离了框架。
我尝试了使用@Bean将这个继承了Runable的方法注解到主类和我的接口中,嗯,这样做似乎是不报错了,启动项目也很正常,甚至在idea的界面上,@value注解的这些值
坑
都有显示,然而只要代码中需要获取@Value注解的值时,程序就会疯狂报异常。Debug 时这些值露出了真面目, 全是 null ,尝试了各种办法,配置文件读取方式尝试了几个也都无疾而终,最后放弃了线程池。 然后程序就开了绿灯,不再需要构造参数传参,没有无法注解的坑,所有对象都用@Autowired注解到spring容器中,让spring管理起来。OK,完美。 @value成功的获取到了配置文件中的值
总结一下@value能获取到值的要求。
1.使用@value 的类中必须被@Service 或@Component注解
2.从请求进入接口开始,所有的方法都必须注入到 Spring boot容器中,被Spring boot所管理。
3.对象必须使用@Autowired注入,才能正常使用@Value注解,(而不是new 的对象)

另一种获取配置文件参数的方法(配置类接收)

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties(prefix = "index")
public class ReIndexConfig {

    private int bulkActions;

    private int flushInterval;

    private int bulkSize;

    public int getBulkActions() {
        return bulkActions;
    }

    public void setBulkActions(int bulkActions) {
        this.bulkActions = bulkActions;
    }

    public int getFlushInterval() {
        return flushInterval;
    }

    public void setFlushInterval(int flushInterval) {
        this.flushInterval = flushInterval;
    }

    public int getBulkSize() {
        return bulkSize;
    }

    public void setBulkSize(int bulkSize) {
        this.bulkSize = bulkSize;
    }
}

猜你喜欢

转载自blog.csdn.net/w4187402/article/details/85052960