问题说明
今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入,bean对象的值为null。
原因分析
web容器在启动应用时,并没有提前将线程中的bean注入(在线程启动前,web容易也是无法感知的)
解决方案
方法有多种,网上也看到了不少。
1. 使用static声明变量
可参见
http://blog.csdn.net/bjamosgavin/article/details/6125497
但这个方法自己试了一下但是没有成功。。。
2. 把线程设置为主程序的内部类
这也是一种简单的方法,主程序在web容器加载时肯定是可以注入Spring bean的,那么将线程的实现类放在主程序的类中便可以“共享”Spring的bean,(当然,这需要提前把线程中的需要用到的bean定义在外层的类中)。
具体操作方法,就是将生成线程的线程池定义在主程序的类中,每个线程的实现类作为内部类也定义在主程序中。这个方法自己试过,是可以的。
3. 使用静态方法直接取的容器中的spring对象
这个方法稍微专业点,可以线程的分发与线程的实现分离出来。在每个线程中使用静态方法直接取的容器中的spring对象。
使用静态方法获取容器中的spring对象可以参见
http://littie1987.iteye.com/blog/937877,
或者http://my.oschina.net/skyline520/blog/181158?p={{page}}
但一定要记住,你定义这个工具类也要配置成spring中的bean!
下面贴一下我在使用时的代码
(1)定义工具类
(2)在Spring中注册工具类的bean
(3)线程中获取bean
今天在web应用中用到了Java多线程的技术来并发处理一些业务,但在执行时一直会报NullPointerException的错误,问题定位了一下发现是线程中的Spring bean没有被注入,bean对象的值为null。
原因分析
web容器在启动应用时,并没有提前将线程中的bean注入(在线程启动前,web容易也是无法感知的)
解决方案
方法有多种,网上也看到了不少。
1. 使用static声明变量
可参见
引用
http://blog.csdn.net/bjamosgavin/article/details/6125497
但这个方法自己试了一下但是没有成功。。。
2. 把线程设置为主程序的内部类
这也是一种简单的方法,主程序在web容器加载时肯定是可以注入Spring bean的,那么将线程的实现类放在主程序的类中便可以“共享”Spring的bean,(当然,这需要提前把线程中的需要用到的bean定义在外层的类中)。
具体操作方法,就是将生成线程的线程池定义在主程序的类中,每个线程的实现类作为内部类也定义在主程序中。这个方法自己试过,是可以的。
3. 使用静态方法直接取的容器中的spring对象
这个方法稍微专业点,可以线程的分发与线程的实现分离出来。在每个线程中使用静态方法直接取的容器中的spring对象。
使用静态方法获取容器中的spring对象可以参见
引用
http://littie1987.iteye.com/blog/937877,
或者http://my.oschina.net/skyline520/blog/181158?p={{page}}
但一定要记住,你定义这个工具类也要配置成spring中的bean!
下面贴一下我在使用时的代码
(1)定义工具类
public class SpringApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context; @Override public void setApplicationContext(ApplicationContext context) throws BeansException { SpringApplicationContextHolder.context = context; } public static Object getSpringBean(String beanName) { notEmpty(beanName, "bean name is required"); return context==null?null:context.getBean(beanName); } public static String[] getBeanDefinitionNames() { return context.getBeanDefinitionNames(); }
(2)在Spring中注册工具类的bean
<bean class="com.xxx.spring.SpringApplicationContextHolder" />
(3)线程中获取bean
UserRepo user = (UserRepo) SpringApplicationContextHolder.getSpringBean("userRepo");
发表评论
-
fastjson合并两个JSONArray
2018-08-20 01:10 0网上使用fastjson合并两个JSONArray的实例基本 ... -
通过ClassPathXmlApplicationContext启动spring容器
2018-05-27 00:21 0对于spring初学者如果想了解spring,那么最简单的方 ... -
git reflog结果分析
2018-05-23 23:50 0git reflog命令用于gitlab中查询历史提交记录, ... -
linux内核OOM源码分析
2018-05-12 21:17 1081Out Of Memory(OOM),即内存 ... -
Java map按值排序
2018-04-22 22:59 0本文提供一个排序工具类,用于Java中的map如何按照va ... -
IDEA中Enable Auto-Import如何取消
2018-05-27 17:34 3794在使用idea进行maven项目开发时,有时候修改了pom ... -
自定义RejectedExecutionHandler的实现
2018-03-12 21:07 01.RejectedExecutionHandler的 ... -
mysql悲观锁原理详解
2018-03-02 17:45 1613mysql中的锁概念 mysql ... -
ibatis两种批量删除方式
2018-02-28 16:23 0ibatis批量操作网上可以搜到到很多,但大部分都是根据某个 ... -
Java判断List中是否有重复元素
2018-02-24 16:25 0在日常Java开发过程中,我们会去判断List集合中是否存 ... -
Gson实现json与map互相转换
2018-02-23 19:04 01.什么是Gson 什么是Gson,我们从其官网上可以看到 ... -
Lambda expressions are not supported at this language level解决方案
2018-02-23 17:21 0Java8正式版本发布后,很多人希望第一时间能够在自己的ma ... -
Java Builder模式的两种实现
2018-02-08 22:06 0前话 在Java开发过程中经常会遇到有多个属性的对象,在构 ... -
linux服务查询jdk版本
2018-05-27 17:27 1768在linux环境下开发java程序的时候,有时候需要了解安 ... -
idea提交svn提示authentication required的解决方法
2017-05-10 10:18 0idea在提交svn项目代码的时候突然提示authenti ... -
Attribute 'singleton' is not allowed to appear in element 'bean' 解决方案
2017-05-05 17:00 01. 问题描述 在spring应用部署过程中抛出如下异常: ... -
python学习
2016-12-13 15:34 0函数介绍 函数 描述 cmp(x,y) ... -
java Date.setTime时间设置逆流
2017-05-05 16:42 1969业务开发过程中需要对java.util.Da ... -
maven包冲突(java.lang.NoSuchMethodError)解决
2017-02-09 11:04 7456在Java项目开发时一般会使用maven作为项目jar包依 ... -
JavaScript美术馆实例
2016-09-16 19:31 0前言 利用JavaScript和DOM去建立一个图片库, ...
相关推荐
但是,这种方法不适用于非Spring管理的线程,因为Spring不会自动为这些线程注入`ApplicationContext`。 5. **ApplicationEventPublisher**:Spring的事件发布机制可以用于线程间的通信。一个线程可以发布事件,另一...
在 Spring 框架中,多线程下注入 Bean 是一个常见的问题。本文将详细介绍 Spring 多线程下注入 Bean 问题,并提供两种解决方案。 问题描述 在多线程环境下,使用 Spring 框架时,可能会遇到 Bean 注入失败的问题。...
在Java编程中,Spring框架是企业级应用开发的首选,它提供了一整套服务和支持,包括依赖注入、AOP(面向切面编程)、事务管理等。当我们谈到在Spring中实现多线程,实际上是在讨论如何在Spring环境中创建、管理和...
**Quartz注入Spring Bean的步骤** 1. **配置Quartz**:在Spring的配置文件中,定义SchedulerFactoryBean,设置相关的Quartz属性,如jobStoreType、configLocation等。 2. **定义JobDetail**:声明JobDetail Bean,...
SpringBoot 多线程处理任务中无法@Autowired注入bean问题解决 在 SpringBoot 应用程序中,多线程处理任务是一个常见的场景,但是,在多线程处理任务中无法使用 @Autowired 注入 bean,这是一个常见的问题。今天,...
在大数据采集项目中,这种灵活性非常有用,因为有时我们可能需要在非Spring管理的组件或线程中访问配置信息或依赖的Bean。确保正确初始化和管理`ApplicationContext`以及配置属性,就能在任何地方充分利用Spring的...
在Spring Boot应用中,我们经常需要在多线程环境下使用由Spring管理的bean。由于线程池中的工作线程并不直接由Spring容器管理,因此不能像单线程环境那样直接通过`@Autowired`注解来注入bean。为了解决这个问题,...
Spring框架和多线程是Java后端开发中的两大核心知识点。本资料包将深入探讨这两个主题,帮助开发者提升技能水平。 Spring框架是Java企业级应用的事实标准,它提供了一个全面的编程和配置模型,简化了Java应用程序的...
在Spring框架中,`@Bean`注解是一个关键的组件,用于声明一个方法将返回的对象作为Spring容器中的bean。在`@Bean`中定义`initMethod`属性,可以指定该bean初始化时需要调用的方法。当`initMethod`被设置为异步执行,...
1. **Java多线程并发**:在Java中,多线程并发是性能优化的关键。它允许程序同时执行多个任务,提高系统的资源利用率。Java提供了多种创建和管理线程的方式,如Thread类、Runnable接口、Executor框架等。理解线程...
Spring框架提供的`org.mockito`库和`@MockBean`注解可以帮助我们在测试中创建和注入mock对象,避免真实线程之间的交互影响测试结果。 通过这些技术的结合,我们可以构建高效、可测试的多线程应用。在Spring4和JUnit...
在IT行业中,多线程和Spring框架是...综上所述,多线程和Spring框架是Java后端开发中的重要组成部分。理解并掌握这些知识点,对于提升系统性能和解决并发问题具有重大意义,同时也有助于在面试中展现出深厚的技术功底。
本示例"maven管理的Spring多线程任务demo"着重展示了如何在Spring框架中利用Maven进行项目构建,并实现多线程任务处理。在SSM(Spring、SpringMVC、MyBatis)框架背景下,如果你已经有所了解,那么这个例子将帮助你...
在Spring框架中,Bean是核心概念,它是Java对象在Spring容器中的实例,通过XML或Java配置来定义。本文将深入探讨Spring项目中的Bean基础配置、别名配置以及作用范围配置。 首先,我们来理解Bean的基础配置。在...
在代码中定义了一个名为springSessionRedisTaskExecutor的Bean,这个线程池会预设核心线程数、最大线程数、线程存活时间、队列容量以及线程名前缀。通过设置这些参数,可以有效控制线程的创建和回收,避免了无限制地...
这份资源包含了Java基础、多线程、Spring框架、Spring Boot、MySQL数据库、Redis缓存以及消息队列MQ等多个核心知识点,每个部分都涵盖了经典且常见的面试问题。 1. **Java基础篇**: - 内存模型:了解JVM内存结构...
总结起来,Spring Boot通过其对Java并发库的支持和自身提供的异步处理机制,使得开发人员能轻松地在应用中引入多线程。通过合理配置线程池和使用`@Async`注解,可以有效地实现任务的并发执行,提高应用性能。在`...
1. **ThreadLocal**: Spring提供了ThreadLocalRequestContext,它可以存储并隔离每个线程的请求上下文,例如当前用户信息,避免了多线程环境中的数据污染。在Service层或Controller层,我们可以利用ThreadLocal来...
在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、负载均衡或读写分离等高级功能。本教程将深入探讨如何在Spring中配置和管理...
JavaConfig是Spring框架下的一个子项目,它提供了一种全新的方式来配置Spring容器中的Bean,这种方式不再依赖于XML配置文件,而是利用Java语言本身的特性(如注解)来进行Bean的定义、装配和管理。JavaConfig的出现...