Java 从使用new关键字调用时提供空指针的组件调用的自动连线服务

Java 从使用new关键字调用时提供空指针的组件调用的自动连线服务,java,spring-mvc,dependency-injection,autowired,Java,Spring Mvc,Dependency Injection,Autowired,我有一个问题,我必须使用arrayblocking队列服务,我的体系结构如下: 控制器: @controller--- @Autowired private AdhocService adhocService; @RequestMapping(value = "/upload", method = RequestMethod.POST) public String uploadFile(){ adhocService.processFile(); } 服务: 我有一

我有一个问题,我必须使用arrayblocking队列服务,我的体系结构如下:

控制器:

@controller---
@Autowired
private AdhocService adhocService;

@RequestMapping(value = "/upload", method = RequestMethod.POST)
    public String uploadFile(){
        adhocService.processFile();

}
服务:

我有一个使用arrayblocking队列启动新线程进行读写的方法

    @service
-----
    public void processFileData(InputStream inputStream, Character delimiter, Character quoteChar,String fileName,String type, String report, String desc)
        {


        try {
        long startTime = System.nanoTime();

            ExecutorService producerPool = Executors.newFixedThreadPool(1);
            ExecutorService consumerPool = Executors.newFixedThreadPool(1);
            producerPool.submit(new AdhocTasks(false, inputStream, delimiter, quoteChar, fileName, type, report, desc));
            consumerPool.submit(new AdhocTasks(true, null, null, null, null, null, null, null));    
            producerPool.shutdown();
            consumerPool.shutdown();
我这里也有更多的方法

组成部分:

    @Component
    public class AdhocTasks implements Runnable,QueueService {


    @Autowired
    private AdhocService adhocService;


    //CONSTRUCTOR - PARAMETERIZED

    public AdhocTasks(Boolean consumer, InputStream stream, Character delimiter,Character quoteChar,String fileName,String type, String report, String desc) {
        this.isConsumer=consumer;
        this.stream = stream;
        this.delimiter=delimiter;
        this.quoteChar=quoteChar;
        this.fileName = fileName;
        this.type = type;
        this.report = report;
        this.desc = desc;

    }

@Override
    public void run() {


        if(this.isConsumer) {
            consumeFileData();
        }else {
            readFileData();
        }

    }
在adhoctask中,文件声明为组件:

    @Component
    public class AdhocTasks implements Runnable,QueueService {


    @Autowired
    private AdhocService adhocService;


    //CONSTRUCTOR - PARAMETERIZED

    public AdhocTasks(Boolean consumer, InputStream stream, Character delimiter,Character quoteChar,String fileName,String type, String report, String desc) {
        this.isConsumer=consumer;
        this.stream = stream;
        this.delimiter=delimiter;
        this.quoteChar=quoteChar;
        this.fileName = fileName;
        this.type = type;
        this.report = report;
        this.desc = desc;

    }

@Override
    public void run() {


        if(this.isConsumer) {
            consumeFileData();
        }else {
            readFileData();
        }

    }
我有consumeFileData和readFileData的实现。现在的问题是在consumeFileData中调用autowired adhocService.consume()时:

但它不起作用: 给我

空指针,因为adhocService对象为空


任何人都可以帮助吗

调用该方法时,问题不会发生,只要spring启动,问题就会发生

AdhocTasks
是一个弹簧组件。因此,它的构造函数会像对任何bean一样被调用。但是由于它的构造函数有参数,每个参数都必须被视为一个依赖项,所以Spring尝试将它们与SpringBean连接起来。
第一个问题:大多数参数找不到匹配的候选bean;第二个问题:您不想自动关联这些参数

作为解决方法,稍微更改一下您的设计。 不要让
AdhocTasks
成为您不想要的Springbean,不要注入它所需的服务,而是在实例化该服务时将其作为参数传递:

@Autowired
private AdhocService adhocService;
//..
producerPool.submit(new AdhocTasks(adhocService, false, inputStream, delimiter, quoteChar, fileName, type, report, desc));

调用该方法时不会出现问题,问题会在spring启动时立即出现

AdhocTasks
是一个弹簧组件。因此,它的构造函数会像对任何bean一样被调用。但是由于它的构造函数有参数,每个参数都必须被视为一个依赖项,所以Spring尝试将它们与SpringBean连接起来。
第一个问题:大多数参数找不到匹配的候选bean;第二个问题:您不想自动关联这些参数

作为解决方法,稍微更改一下您的设计。 不要让
AdhocTasks
成为您不想要的Springbean,不要注入它所需的服务,而是在实例化该服务时将其作为参数传递:

@Autowired
private AdhocService adhocService;
//..
producerPool.submit(new AdhocTasks(adhocService, false, inputStream, delimiter, quoteChar, fileName, type, report, desc));

Spring尝试插入构造函数的参数,因此它尝试查找找不到的Boolean类型的bean。是的,但是如果我删除@autowired in构造函数,那么它会给我null指针异常,因为dhocservice为nullSpring尝试插入构造函数的参数,因此它尝试查找Boolean类型的bean,而找不到。是的,但是如果我删除@autowired in构造函数,它会给我null指针异常,因为dhocservice为null,但我正在调用submit in adhoc服务本身。在AdhocService中使用adhoc service autowire不是一个好主意。查看更改的问题如果您从adhoc service创建
AdhocTasks
实例,那就更简单了:只需将其作为
this
@GhostCat传递即可。谢谢,我也希望你:)呜呜。。。谢谢你提供我错过的重要信息。这看起来够可怕的了。而且不可能有叉子…但我称之为临时提交服务本身。在AdhocService中使用adhoc service autowire不是一个好主意。查看更改的问题如果您从adhoc service创建
AdhocTasks
实例,那就更简单了:只需将其作为
this
@GhostCat传递即可。谢谢,我也希望你:)呜呜。。。谢谢你提供我错过的重要信息。这看起来够可怕的了。而且不可能。。。