Spring在bean中注入任务执行器

时间:2017-07-30 16:45:21

标签: java spring spring-boot

我使用的是Spring Boot,而且我无法在服务bean中注入任务执行程序。 这是一些代码:

@Service
public class ClassA {
 @Autowired
    private ThreadPoolTaskExecutor taskExecutor;

 public void doSht(){
     for(int i = 0; i<this.taskExecutor.getMaxPoolSize(); i++){
         this.taskExecutor.execute(new ClassB());
     }
 }
}

B组:

public class ClassB implements Runnable {

    @Override
    public void run() {
        System.out.println("Class B running");
    }

}

控制器:

@Controller
public class IndexController {
    @Autowired
    ClassA ca;

    @RequestMapping("/")
    public String index(){
        return "index";
    }

    @RequestMapping("test")
    public String test(ClassA ca){
        ca.doSht();
        return "test";
    }
}

这是任务执行者配置:

@SpringBootApplication
public class App{
    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(5);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(30);
        return taskExecutor;
    }


    public static void main(String[] args) throws Exception{
        SpringApplication app = new SpringApplication(App.class);
        app.run(args);
    }
}

我希望在请求到/ test时执行ClassB实例,但是我得到一个NullPointerException,因为任务执行程序没有自动连接到ClassA bean。

我做错了什么?

2 个答案:

答案 0 :(得分:1)

要修正错误,请参阅以下说明:

  1. 转到IndexController课程

  2. 转到public String test(ClassA ca)方法

  3. 删除Class ca输入参数表单测试方法

  4. 测试方法应该是这样的

  5. 测试方法改变了:

       @RequestMapping("test")
        public String test(){
            ca.doSht();
            return "test";
        }
    

    引起空指针异常是因为测试方法使用ca方法参数而不是来自ca注释的@Autowired对象

答案 1 :(得分:0)

当你在App类中使用@SpringBootApplication时,它正在将自定义bean定义注册到IOC,并且它正确地自动装配bean。否则,您将在自动装配课程中遇到错误。

所以它不是自动装配的问题。您可以设置调试点来检查它。现在在您的控制器中,您使用相同的名称将您的实例变量与方法参数混淆。此外@RequestMapping不提供自定义类对象。因此,它将变为空,您将获得异常。

希望你能理解这个问题。