您的位置:首页 > 编程语言 > Java开发

SpringBoot项目使用多线程处理定时任务时无法通过@Autowired注入bean

2019-02-15 11:09 711 查看

需求是做定时任务推送消息或者修改状态,springBoot中在多线程中为了线程安全,一般都是防止注解注入的,新线程中@Autowired注解无法注入需要的bean(即:保存历史数据的service层),程序一直在报 NullPointerException ,所以需要调用spring中的ApplicationContext来获取封装的bean。
解决可以写一个工具类来获取spring中的bean

package com.ksky.common.config;

import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
* @ProjectName:
* @Package: com.ksky.common.config
* @ClassName: ApplicationContextProvider
* @Description: 获取bean对象的工具类
* @Author: YangYeZhu
* @CreateDate: 2019/2/15
* @Version: 1.0
*/

/**
* Author:YangYeZhu
* Date:2019/2/15
*/
@Component
public class ApplicationContextProvider implements ApplicationContextAware {
/**
* 上下文对象实例
*/
private static ApplicationContext applicationContext;

@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}

/**
* 获取applicationContext
*
* @return
*/
public static ApplicationContext getApplicationContext() {
return applicationContext;
}

/**
* 通过name获取 Bean.
*
* @param name
* @return
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}

/**
* 通过class获取Bean.
*
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}

/**
* 通过name,以及Clazz返回指定的Bean
*
* @param name
* @param clazz
* @param <T>
* @return
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
}

获取bean的工具类写好后,在方法中需要使用注入对象时,可以先获取通过工具类获取对象,在进行接口调用。

this.projectManageService = ApplicationContextProvider.getBean(ProjectManageService.class);
List<Project> list = projectManageService.list(false);

好了,问题就得到解决了,文章中如错误或不足,请指出,不胜感激,本人小白一枚,如有不足,请多多包含,也请各位大神能不吝赐教,抱拳

参考地址:https://blog.csdn.net/zsj777/article/details/80965081

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: