Spring Task中的定时任务无法注入service的解决办法

小灰灰 2020-11-14 22:00 1857阅读 0赞

因一个项目(使用的是Spring boot)需要在spring task定时任务中调用数据库操作,在使用 @Autowired或者@Resource注入service时后台报错,导致系统不能访问。

2、代码

定时任务的代码如下:

  1. @Component
  2. public class TaskJob {
  3. Logger logger = Logger.getLogger(TaskJob.class);
  4. @Autowired
  5. private TempService tempService ;
  6. @Scheduled(cron = "* * /1 * * ?")
  7. public void getDoorToken() {
  8. //定时执行代码,需要
  9. ...数据库操作...
  10. }

3、原因分析

由于定时 @Scheduled的执行优先级高于@Autowired注入,因此我们不能通过@Autowired注入service。

4、解决办法

在定时任务中通过在ApplicationContext中按名称查找service的实例,以便执行后续数据库操作。

4.1 定时任务中代码示例:TempService tempService = (TempService)ApplicationContextUtil.getBean(“tempService”);
4.2 在ApplicationContext中查找service代码示例:

关键是要实现 ApplicationContextAware,同时需要在Spring中注入

  1. @Component
  2. public class ApplicationContextUtil implements ApplicationContextAware {
  3. private static ApplicationContext context;
  4. @Override
  5. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  6. context = applicationContext;
  7. }
  8. public static ApplicationContext getApplicationContext() {
  9. return context;
  10. }
  11. public static Object getBean(String name) {
  12. return getApplicationContext().getBean(name);
  13. }
  14. …其他代码…
  15. }

发表评论

表情:
评论列表 (有 0 条评论,1857人围观)

还没有评论,来说两句吧...

相关阅读

    相关 [java]spring-task定时任务

    前面两篇博客讲解了Quartz来实现定时任务,不过spring3以后,自己封装了spring的task来实现定时任务,配置起来不要太简单,用起来真的很方便,下面咱们来一起实现一