springboot 在线程中注入bean,解决注入bean为null的问题
解决问题:
在我们开发过程中总会遇到比如在线程中需要代用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的问题相关推荐
- 如何在线程中获取spring 管理的bean
问题说明 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入 ...
- 在多个线程中使用QNetworkAccessManager
最近发现Tangram发出了URL request, 但是却收不到URL reponse 经研究后发现这是一个线程问题: Tangram会在多个线程发送URL request, 但是在实现时, 却没有 ...
- 记录一个异步任务丢失request的坑,RequestContextHolder.setRequestAttributes(sra, true);异步线程中会丢失
ServletRequestAttributes sra = (ServletRequestAttributes); RequestContextHolder.setRequestAttributes ...
- Servlet自动注入Spring容器中的Bean解决方法
Servlet自动注入Spring容器中的Bean解决方法 参考文章: (1)Servlet自动注入Spring容器中的Bean解决方法 (2)https://www.cnblogs.com/jank ...
- Java(多)线程中注入Spring的Bean
问题说明 : 今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被 ...
- SpringBoot —— Bean的注入方式
文章目录 1.组件注解 2.@Component + @Bean 3.@Import(PlaceHolderClass)快速导入一个组件 4.使用Spring提供的FactoryBean注入 1.组件 ...
- SpringBoot集成Es使用ElasticSearchTemplate7.x版本自动注入失败解决
SpringBoot集成Es使用ElasticSearchTemplate7.x版本自动注入失败解决 错误: Caused by: org.springframework.beans.factory. ...
- Spring在多线程中bean的注入问题
Spring 在多线程中,bean的注入问题 使用SSM框架,在Service层需要另开一个线程,在线程中使用@Resource或者@Autowired注入全部为NULL, @Component pu ...
- springboot:根据不同配置注入不同实现的bean
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言` 我们在开发过程中,往往会碰到服务面向不同的应用场景的情况,需要根据配置进行bean的注入,以此来增加服务的灵活性: ...
最新文章
- java实现简单窗体小游戏----球球大作战
- 三层架构下实现用户登陆C#
- 10种不要钱的护肤法则 - 生活至上,美容至尚!
- goahead content-length为0时的问题
- 与NWBC相关的服务器端配置
- MS SQL Server 常用操作
- HMM_概率计算——forwar_algorithm实现
- FreeBSD重新加载rc.conf
- es6 数组找最大值_JavaScript(es6)数组常用的方法
- unicode编码表_关于编码
- Java package 与 import
- nginx+keepalived构建主备负载均衡代理服务器
- Visual Leak Detector(vld)无法显示内存泄露文件名称与行号
- python基础什么是函数的定义及用法
- P4556 [Vani有约会]雨天的尾巴(线段树合并)
- win10定时开机(Win10定时开机关机)
- 《信息物理融合系统(CPS)设计、建模与仿真——基于 Ptolemy II 平台》——1.2 域和计算模型...
- 中国 98 家央企及下属 409 家上市企业全名单( 2023 最新版)
- Android 客户端直播实现
- ZOJ2604-DP
热门文章
- VIEW PUSHED PREDICATE(谓词推入)引发的惨剧
- Python小游戏之王者荣耀
- 【Nowcoder】2021牛客暑假集训营(第七场): xay loves trees 双指针 + 线段树 + 尺取
- python珠穆朗玛峰问题_珠穆朗玛峰有多可怕?看沿途看完就明白了!
- #HHD32F107# AD采集
- SpringBoot学习(六)——springboot整合后台模板
- 值传递与引用传递详解
- php 文件头部(header)信息详解
- 物联网,已经到来的产业“风口”
- windows下的.DLL文件