我正在尝试让一个类定期从rest api请求数据,以检查我的数据库中的数据是否仍然是最新的。
文档说要启用调度我应该将@EnableScheduling
注释添加到配置类中,然后我就可以在容器中的任何spring托管bean上使用@Scheduled
注释。
一切正常,但我不完全理解容器中的任何弹簧管理bean 意味着什么。现在我在配置类中声明了这样的bean(类CapsuleRestApi
是负责从api请求数据的类)
@Bean
public CapsuleRestApi capsuleDatabaseJpa() {
return new CapsuleRestApi();
}
然后我在CapsuleRestApi类中使用了这个方法
@Scheduled(fixedDelay = 2000)
public void refresh() {
// refresh and check changes
}
有没有其他方法可以让它工作而不添加方法作为bean?我不完全理解为什么它适用于bean方法。
答案 0 :(得分:1)
容器中任何弹簧托管bean的含义。
这意味着,Spring应该在启动时了解这个类。
如果你把@Scheduled
放在一个弹簧在启动过程中没有扫描的类的方法中,这个注释没有任何意义。
例如。考虑你有这样的课程
class NotManagedBean {
@Scheduled
public void scheduler() {
.....
}
}
您将看到此计划方法永远不会执行。因为,Spring容器并不了解这个类。那是因为没有扫描。这是因为它不是一个春天豆。
现在在课堂上添加@Component
或Service
。这将使该类成为一个spring bean,它将起作用。
当你执行@Bean
这意味着,你宣布一个bean。因此它有效。
希望很清楚