SpringBoot|SpringBoot 定时任务依赖注入失败记录

前言 【SpringBoot|SpringBoot 定时任务依赖注入失败记录】日志系统需要每天推送每天日志统计到钉钉群,至于如何实现向钉钉推送请参考:java(SpringBoot)实现钉钉推送。学长他们的用的是一个固定的Webhooksecrect,这样就会导致一个问题,下次修改推送群那么就需要修改源代码,于是乎我加了一个钉钉数据表,这样就可以做到随意更改推送群了。
实现过程:
添加钉钉实体: 主要字断:webhooksecrect

/** * 钉钉 * @author hzl */ @Entity public class Ding { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @JsonView(base.class) private Long id; private String webHook = ""; private String secret = ""; public Long getId() { return id; }public String getWebHook() { return webHook; }public void setWebHook(String webHook) { this.webHook = webHook; }public String getSecret() { return secret; }public void setSecret(String secret) { this.secret = secret; }public interface base {} }

添加仓库
/** * 钉钉 */ @Repository("DingRepository") public interface DingRepository extends CrudRepository { }

运行结果: dingRepository为空?可是我用@Autowired自动注入了啊
SpringBoot|SpringBoot 定时任务依赖注入失败记录
文章图片

SpringBoot|SpringBoot 定时任务依赖注入失败记录
文章图片

排查过程:
SpringBoot|SpringBoot 定时任务依赖注入失败记录
文章图片

结果: 初始化文件中DingRepository正常
初步猜想:定时任务影响依赖注入。
验证猜想:定时任务影响依赖注入
经过搜索发现猜想正确!
@Scheduled执行优先级大于@Autowired,因此不要期待SpringBoot给我们实现依赖注入了。
解决办法
ApplicationContextAware 介绍:在项目初始化的时候,会去寻找他的实现类,同时通过setApplicationContext方法将上下文(ApplicationContext)注入进来,当我们需要的时候便可以根据其封装好的方法获取自己想要的东西。同样他也继承了BeanFactory,我们可以根据BeanFactorygetBean获取自己想要的Bean
SpringBoot|SpringBoot 定时任务依赖注入失败记录
文章图片

实例化ApplicationContextAware,给出如下参考:
@Component public class ApplicationContextUtil implements ApplicationContextAware {private static ApplicationContext applicationContext; public static ApplicationContext getApplicationContext() { return applicationContext; }@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { ApplicationContextUtil.applicationContext = applicationContext; }public static Object getBean(String beanName) { return applicationContext.getBean(beanName); } }

至此我的疑问解除,通过查询得知其实也有很多地方无法直接使用Dao层等,如:Utils,这个时候ApplicationContextAware真的可以帮我们大忙。

    推荐阅读