许久没有写博文了,今天来写写,毕业设计中遇到的某个小问题,及解决方法。
毕业设计中涉及到spring的定时器quartzy的使用,
遇到的问题是:quartzy中不能使用spring注入的方式注入dao层和service层,原因是spring在加载的时候先加载quarzy,后加载bean。查看了一下源代码:org.springframework.scheduling.quartz.JobDetailFactoryBean。
这个类我们只看他的实现:
![JobDetailFactoryBean类的实现](https://img-blog.csdn.net/20170416232235638?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWFpeWlrYWk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
实现了ApplicationContextAware,这个类是我当时在实现rpc服务的时候了解过的一个类,适用于异步加载的,可以理解为分开执行,所以我的的bean并不能被注入到quartzy中。
不过利用了一个晚上的时间查找了一些资料,终于皇天不负有心人,找到了一篇:原文地址
接下来我们看代码:
先重写一下AdaptableJobFactory类中的createJobInstance(TriggerFiredBundle bundle)方法:
public class JobFactory extends AdaptableJobFactory{
//这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴.
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle)
throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//AutowireCapableBeanFactory这个接口一般在applicationContext的内部是较少使用的,
//它的功能主要是为了装配applicationContext管理之外的Bean。