Spring在异步中无法自动注入(@Autowired)实例问题
1、Spring实现异步开发
在较大型项目中,肯定会用到Java多线程的功能,不可能全部等待主线程来执行所有的任务,这样会一种的消耗时间。
在spring中通过注解方式就可以达到多线程的效果,不需要自己实现Runnable
接口或者继承Thread
的方法来实现多线程。通过@Anysc
注解就可以实现异步开发,不阻塞主线程,开启线程来执行相应的任务。
具体的实现方式是,在Spring的配置类上加上注解@EnableAsync
,表示启动异步任务,然后在具体的方法上面加上@Anysc
注解,则表明该方法就可以通过异步的方式实现了。
2、Spring在异步中无法自动注入(@Autowired)实例问题
采用异步开发,等让效率得到提升,但是也会遇到一些问题,比如在Spring/SpringBoot
经常会用@Autowired
注解来实现自动注入Bean,但是在异步任务中,再通过自动注入获取实例对象就不行了,因为获得到的实例都为Null
。再调用实例的方法就会抛出空指针异常。
这说明在异步任务中是不能采用自动注入的方法,为了解决这一问题,在网上找了很多的资料才发现下面这个代码是可以解决这个问题的,亲测可用。
以下代码来自于博文解决SpringBoot/Spring在异步中无法注入实例问题
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SpringUtils implements ApplicationContextAware {
private static ApplicationContext applCon;
/**
* 为空时,设置实例
*/
@Override
public void setApplicationContext(ApplicationContext applCon) throws BeansException {
if (SpringUtils.applCon == null) {
SpringUtils.applCon = applCon;
}
}
/**
* 获取applicationContext的实例applCon
*/
public static ApplicationContext getApplicationContext() {
return applCon;
}
/**
* 通过name,以及Clazz获取指定的Bean
*/
public static <T> T getBean(String name, Class<T> clazz) {
return getApplicationContext().getBean(name, clazz);
}
/**
* 通过clazz获取Bean(推荐使用这种)
*/
public static <T> T getBean(Class<T> clazz) {
return getApplicationContext().getBean(clazz);
}
/**
* 通过name获取 Bean
*/
public static Object getBean(String name) {
return getApplicationContext().getBean(name);
}
}