为什么Spring @Scheduled不能与@Bean一起使用

时间:2017-01-27 20:14:42

标签: spring spring-boot scheduled-tasks

我正在使用Spring Boot和Scheduling。

在Spring中,为什么这会正常工作(该方法每5秒调用一次) -

//@Bean
@Scheduled(fixedRate = 5000)
public void foo() {
     System.out.println("bar");
}

但这不是(该方法不会每5秒调用一次) -

@Bean
@Scheduled(fixedRate = 5000)
public void foo() {
     System.out.println("bar");
}

3 个答案:

答案 0 :(得分:1)

@Bean注释用于基于Java的配置,以注释构造bean的方法。这只是错误的注释,不应该存在。

答案 1 :(得分:1)

@Bean注释用于定义bean实例,并且必须返回结果。 @Scheduled注释属于 bean方法,而不是bean本身,并且该方法必须返回void。另外,不要忘记通过将@EnableScheduling放在@Configuration个类之上来启用计划。例如:

<强> MyConfig.java

@Configuration
@EnableScheduling
public class MyConfig
{
}

<强> MyScheduledJob.java

@Component
public class MyScheduledJob
{
    @Scheduled(fixedRate = 5000)
    public void doSomething() // Note: Should only return void
    {
        System.out.println(Instant.now() + ": MyScheduledJob.doSomething() invoked.");
    }
}

输出:

2017-01-28T03:08:04.760Z:  MyScheduledJob.doSomething() invoked.
2017-01-28T03:08:09.756Z:  MyScheduledJob.doSomething() invoked.
2017-01-28T03:08:14.755Z:  MyScheduledJob.doSomething() invoked.
2017-01-28T03:08:19.758Z:  MyScheduledJob.doSomething() invoked.

答案 2 :(得分:0)

您在该方法上使用的两个注释组合起来没有多大意义。

@Bean用于为应用程序中的自动装配依赖项创建单例。 http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch02s02.html

@Scheduled用于计划重新运行的任务。
https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

这没有意义的原因在于,通常,您的Bean在应用程序启动时创建并自动装入其依赖项(完成一次)。相比之下,Schedule意味着你希望这种情况经常发生。