Spring MVC声明使用@Scheduled的bean
Spring MVC声明使用@Scheduled的bean
这个问题已经在这里有了答案:
我试图让一个类周期性地从rest api请求数据,检查我数据库中的数据是否仍然是最新的。
文档说,要启用调度,我应该在配置类中添加@EnableScheduling
注解,然后就可以在容器中任何Spring管理的bean上使用@Scheduled
注解。
这一切都能工作,但我不完全理解容器中任何Spring管理的bean是什么意思。现在我在配置类中像这样声明了bean(类CapsuleRestApi
是负责从api请求数据的类)
@Bean public CapsuleRestApi capsuleDatabaseJpa() { return new CapsuleRestApi(); }
然后我在CapsuleRestApi类中使用了这个方法
@Scheduled(fixedDelay = 2000) public void refresh() { // refresh and check changes }
有没有其他方法可以使其工作,而不必将方法添加为bean?我不完全理解为什么使用bean方法会起作用。
admin 更改状态以发布 2023年5月21日
容器中任何一个Spring管理的Bean都是什么意思。
这意味着,Spring在启动时应该知道这个类。
如果在Spring启动期间spring没有扫描的类的方法上放置了@Scheduled
,则此注释没有任何意义。
例如。考虑一个像这样的类
class NotManagedBean { @Scheduled public void scheduler() { ..... } }
你会发现这个被调度的方法从来没有被执行过。因为,Spring容器不知道这个类。这是因为它没有被扫描到。这是因为它不是Spring Bean。
现在在类上添加@Component
或Service
。这将使类成为Spring Bean并起作用。
当你使用@Bean
时,这意味着你正在声明一个Bean。因此它起作用。
希望这很清楚。