解决 Quartz Job 中无法注入 Spring Bean

本文介绍了如何在Quartz集成中避免繁琐的自定义JobFactory,通过创建SpringUtil工具类,实现在Job任务中直接通过Spring获取和注入bean,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近公司业务需要用到Quartz,在集成使用的时候突然发现Job任务类中不可以自动注入spring管理的对象。在网上找了很多解决方法,基本上都是自定义JobFactory,通过 AutowireCapableBeanFactory 将创建好的 Job 对象交给 Spring 管理。但是我觉得过于繁琐,从而研究出以下方案:

思路:创建一个 Spring 工具类,在Job任务中使用Spring工具类获取Spring bean

Spring工具类(自行导包):

@Slf4j
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext context;

@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
SpringUtil.context = context;
}

/**
* 获取 Spring Bean
*
@param clazz 类
@param <T泛型
@return 对象
*/
public static <T> T getBean(Class<T> clazz) {
if (clazz == null) {
return null;
}
return context.getBean(clazz);
}

/**
* 获取 Spring Bean
*
@param bean 名称
@param <T泛型
@return 对象
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String bean) {
if (bean == null) {
return null;
}
return (T) context.getBean(bean);
}

/**
* 获取 Spring Bean
*
@param beanName 名称
@param clazz 类
@param <T泛型
@return 对象
*/
public static <T> T getBean(String beanName, Class<T> clazz) {
if (null == beanName || "".equals(beanName.trim())) {
return null;
}
if (clazz == null) {
return null;
}
return (T) context.getBean(beanName, clazz);
}

/**
* 获取上下文
*
@return 上下文
*/
public static ApplicationContext getContext() {
if (context == null) {
throw new RuntimeException("There has no Spring ApplicationContext!");
}
return context;
}

/**
* 发布事件
*
@param event 事件
*/
public static void publishEvent(ApplicationEvent event) {
if (context == null) {
return;
}
try {
context.publishEvent(event);
} catch (Exception ex) {
log.error(ex.getMessage());
}
}

}

Job任务类:

@Component
public class InventoryJob implements Job {
        @Override
        public void execute(org.quartz.JobExecutionContext jobExecutionContext) throws         org.quartz.JobExecutionException {
                InventoryEarlyWarningService inventoryEarlyWarningService =                 SpringUtil.getBean(InventoryEarlyWarningService.class);
                inventoryEarlyWarningService.queryInventoryQuarz(1736679500400537603L);
        }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值