解决问题:

在我们开发过程中总会遇到比如在线程中需要代用service或者mapper等读取数据库,或者某些自动注入bean失效的情况

问题分析:

在线程中因为线程是安全的,所以是无法自动注入bean的

解决方法:

1.在构造方法中通过工具类获取需要的bean

工具类代码:


import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;/*** @author yang* @decription 通过工具类获取需要的的bean*/
@Component
public class BeanContextUtils implements ApplicationContextAware {/*** 上下文对象实例*/private static ApplicationContext applicationContext;@Overridepublic 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);}}

测试线程代码:


public class TestThread implements Runnable {private ISysUserService iSysUserService;public TestThread(){this.iSysUserService = BeanContextUtils.getBean(ISysUserService.class);}@Overridepublic void run() {SysUser sysUser = iSysUserService.selectUserById(1l);System.out.println("测试通过工具类获取bean 获取用户名 : {} "+sysUser.getUserName());}
}

调用线程执行:

TestThread testThread = new TestThread();testThread.run();

测试结果:

注意:类上面不需要添加@Component,@Service等注解

2.通过set方法注入bean
测试线程代码:


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
public class TestThread implements Runnable {private static ISysUserService iSysUserService;@Autowiredpublic void setISysUserService(ISysUserService iSysUserService){TestThread.iSysUserService = iSysUserService;}@Overridepublic void run() {SysUser sysUser = iSysUserService.selectUserById(1l);System.out.println("测试通过set方法获取bean 获取用户名 : {} "+sysUser.getUserName());}
}

调用代码:

TestThread testThread = new TestThread();testThread.run();
测试结果:


注意:类上面需要添加@Component注解

3.通过静态初始化执行类的方式调用类中的bean
测试线程代码:

import javax.annotation.PostConstruct;@Component
public class TestThread implements Runnable {@Autowiredprivate ISysUserService iSysUserService;//创建静态的线程类属性private static TestThread testThread;@PostConstructpublic void testThreadInit(){System.out.println("执行成功");testThread = this;}@Overridepublic void run() {SysUser sysUser = this.testThread.iSysUserService.selectUserById(1l);System.out.println("测试通过静态初始化执行类 获取bean 获取用户名 : {} "+sysUser.getUserName());}
}

调用测试:

TestThread testThread = new TestThread();testThread.run();

测试结果:

4.通过有参构造方法传入

测试线程代码:

public class TestThread implements Runnable {private ISysUserService iSysUserService;public TestThread(ISysUserService iSysUserService){this.iSysUserService = iSysUserService;}@Overridepublic void run() {SysUser sysUser = iSysUserService.selectUserById(1l);System.out.println("测试通过有参构造方法传入 获取bean 获取用户名 : {} "+sysUser.getUserName());}
}

调用代码:

//在引用类中自动注入bean或者其他方式注入bean@Autowiredprivate ISysUserService iSysUserService;//再引用方法中引用测试线程
TestThread testThread = new TestThread(iSysUserService);testThread.run();

测试结果:

亲测可用,还有以上的bean是自己创建,这里就不出示实例啦!!!
这里也有其他的bean注入方式仅供参考
注入bean的其他几种方式

springboot 在线程中注入bean,解决注入bean为null的问题相关推荐

  1. 如何在线程中获取spring 管理的bean

    问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...

  2. 在多个线程中使用QNetworkAccessManager

    最近发现Tangram发出了URL request, 但是却收不到URL reponse 经研究后发现这是一个线程问题: Tangram会在多个线程发送URL request, 但是在实现时, 却没有 ...

  3. 记录一个异步任务丢失request的坑,RequestContextHolder.setRequestAttributes(sra, true);异步线程中会丢失

    ServletRequestAttributes sra = (ServletRequestAttributes); RequestContextHolder.setRequestAttributes ...

  4. Servlet自动注入Spring容器中的Bean解决方法

    Servlet自动注入Spring容器中的Bean解决方法 参考文章: (1)Servlet自动注入Spring容器中的Bean解决方法 (2)https://www.cnblogs.com/jank ...

  5. Java(多)线程中注入Spring的Bean

    问题说明 : 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被 ...

  6. SpringBoot —— Bean的注入方式

    文章目录 1.组件注解 2.@Component + @Bean 3.@Import(PlaceHolderClass)快速导入一个组件 4.使用Spring提供的FactoryBean注入 1.组件 ...

  7. SpringBoot集成Es使用ElasticSearchTemplate7.x版本自动注入失败解决

    SpringBoot集成Es使用ElasticSearchTemplate7.x版本自动注入失败解决 错误: Caused by: org.springframework.beans.factory. ...

  8. Spring在多线程中bean的注入问题

    Spring 在多线程中,bean的注入问题 使用SSM框架,在Service层需要另开一个线程,在线程中使用@Resource或者@Autowired注入全部为NULL, @Component pu ...

  9. springboot:根据不同配置注入不同实现的bean

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言` 我们在开发过程中,往往会碰到服务面向不同的应用场景的情况,需要根据配置进行bean的注入,以此来增加服务的灵活性: ...

最新文章

  1. java实现简单窗体小游戏----球球大作战
  2. 三层架构下实现用户登陆C#
  3. 10种不要钱的护肤法则 - 生活至上,美容至尚!
  4. goahead content-length为0时的问题
  5. 与NWBC相关的服务器端配置
  6. MS SQL Server 常用操作
  7. HMM_概率计算——forwar_algorithm实现
  8. FreeBSD重新加载rc.conf
  9. es6 数组找最大值_JavaScript(es6)数组常用的方法
  10. unicode编码表_关于编码
  11. Java package 与 import
  12. nginx+keepalived构建主备负载均衡代理服务器
  13. Visual Leak Detector(vld)无法显示内存泄露文件名称与行号
  14. python基础什么是函数的定义及用法
  15. P4556 [Vani有约会]雨天的尾巴(线段树合并)
  16. win10定时开机(Win10定时开机关机)
  17. 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.2 域和计算模型...
  18. 中国 98 家央企及下属 409 家上市企业全名单( 2023 最新版)
  19. Android 客户端直播实现
  20. ZOJ2604-DP

热门文章

  1. VIEW PUSHED PREDICATE(谓词推入)引发的惨剧
  2. Python小游戏之王者荣耀
  3. 【Nowcoder】2021牛客暑假集训营(第七场): xay loves trees 双指针 + 线段树 + 尺取
  4. python珠穆朗玛峰问题_珠穆朗玛峰有多可怕?看沿途看完就明白了!
  5. #HHD32F107# AD采集
  6. SpringBoot学习(六)——springboot整合后台模板
  7. 值传递与引用传递详解
  8. php 文件头部(header)信息详解
  9. 物联网,已经到来的产业“风口”
  10. windows下的.DLL文件