Spring在异步中无法自动注入(@Autowired)实例问题

4 篇文章 0 订阅

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);
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值