Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 发送到Spring TaskExecutor的自动关联任务_Java_Spring - Fatal编程技术网

Java 发送到Spring TaskExecutor的自动关联任务

Java 发送到Spring TaskExecutor的自动关联任务,java,spring,Java,Spring,如何让一个类实现Runnable并提交给springs TaskExecutor autowired 例如,我有一项任务: public class MyTask implements Runnable { @Autowired private MyRepository myRepository; @Override public void run() { myRepository.doSomething(); } } 以及向spring T

如何让一个类实现Runnable并提交给springs TaskExecutor autowired

例如,我有一项任务:

public class MyTask implements Runnable {

    @Autowired private MyRepository myRepository;

    @Override
    public void run() {
        myRepository.doSomething();
    }
}
以及向spring TaskExecutor发送任务的服务:

@Service
public class MyService {

    @Autowired private TaskExecutor taskExecutor;

    public void someMethod() {

        MyTask myTask = new MyTask();
        taskExecutor.execute(myTask);

    }

}
我知道这些字段没有自动连接,因为MyTask正在使用new MyTask()进行实例化。然而,我该如何应对呢?我应该访问Spring的ApplicationContext并通过它创建bean吗?在web应用程序环境中如何做到这一点

谢谢

试试看

public class MyTask implements Runnable {
    private MyRepository myRepository;

    public MyTask(MyRepository myRepository) {
         this.myRepository = myRepository;
    }

    @Override
    public void run() {
        myRepository.doSomething();
    }
}

@Service
public class MyService {
    @Autowired private TaskExecutor taskExecutor;
    @Autowired private MyRepository myRepository;


    public void someMethod() {
        MyTask myTask = new MyTask(myRepository);
        taskExecutor.execute(myTask);
    }
}
或者您可以声明MyTask的scope=“prototype”并将MyService更改为

@Service
public class MyService {
    @Autowired private ApplicationContext ctx;

    public void someMethod() {
        MyTask myTask = ctx.getBean(MyTask.class);
        taskExecutor.execute(myTask);
    }
}

使用Spring至少有两种很好的方法。首先是注释。使用这意味着依赖于AspectJ,但它将允许您注入不是由Spring管理的bean(即,您正在使用新的操作符)。这将涉及使用@Configurable注释MyTask,并在Spring配置中添加几行,如链接中所述

@Configurable
public class MyTask implements Runnable { ... }

@Service
public class MyService {
   @Autowired private TaskExecutor taskExecutor;

   public void someMethod() {

     // AspectJ would jump in here and inject MyTask transparently
     MyTask myTask = new MyTask();
     taskExecutor.execute(myTask);

}
}

第二种方法涉及使用Spring的ServiceLocatorFactoryBean特性来创建原型bean。这在中得到了最好的解释,但在这种情况下,您将向@Service注释类中注入TaskFactory,就像其他bean一样,然后执行如下操作:

@Service
public class MyService {
  @Autowired private TaskExecutor taskExecutor;
  @Autowired private MyRepository myRepository;
  @Autowired private TaskFactory taskFactory;


public void someMethod() {
    MyTask myTask = taskFactory.getTask("myTask")
    taskExecutor.execute(myTask);
}
}


MyTask已经被注入到您的存储库中,因为您可以在XML映射中配置它。我每天都会使用这两种方法,但我倾向于使用第二种方法,因为它更容易阅读,并且通过确保开发人员不会做不容易测试的事情来帮助他们保持诚实,坦率地说,对于普通的观察者来说,这更清楚。

是的,这会起作用。我希望在任务中实现自动连接,因为我有很多依赖项,不想全部传递它们-但是,看起来似乎没有办法解决它。@EvgeniyDorofeev我如何将MyTask定义为prototype?如果使用Spring xml配置,则将scope=“prototype”attr添加到MyTask bean定义中