`
nuistcc
  • 浏览: 83863 次
社区版块
存档分类
最新评论

Java(多)线程中注入Spring的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");
分享到:
评论

相关推荐

    线程中获取spring 注解bean

    但是,这种方法不适用于非Spring管理的线程,因为Spring不会自动为这些线程注入`ApplicationContext`。 5. **ApplicationEventPublisher**:Spring的事件发布机制可以用于线程间的通信。一个线程可以发布事件,另一...

    Spring 多线程下注入bean问题详解

    在 Spring 框架中,多线程下注入 Bean 是一个常见的问题。本文将详细介绍 Spring 多线程下注入 Bean 问题,并提供两种解决方案。 问题描述 在多线程环境下,使用 Spring 框架时,可能会遇到 Bean 注入失败的问题。...

    java中spring里实现多线程

    在Java编程中,Spring框架是企业级应用开发的首选,它提供了一整套服务和支持,包括依赖注入、AOP(面向切面编程)、事务管理等。当我们谈到在Spring中实现多线程,实际上是在讨论如何在Spring环境中创建、管理和...

    Quartz注入Spring的Bean

    **Quartz注入Spring Bean的步骤** 1. **配置Quartz**:在Spring的配置文件中,定义SchedulerFactoryBean,设置相关的Quartz属性,如jobStoreType、configLocation等。 2. **定义JobDetail**:声明JobDetail Bean,...

    详解SpringBoot 多线程处理任务 无法@Autowired注入bean问题解决

    SpringBoot 多线程处理任务中无法@Autowired注入bean问题解决 在 SpringBoot 应用程序中,多线程处理任务是一个常见的场景,但是,在多线程处理任务中无法使用 @Autowired 注入 bean,这是一个常见的问题。今天,...

    在非spring注解类中使用spring容器中的bean_普通类中使用yml配置文件中的配置信息

    在大数据采集项目中,这种灵活性非常有用,因为有时我们可能需要在非Spring管理的组件或线程中访问配置信息或依赖的Bean。确保正确初始化和管理`ApplicationContext`以及配置属性,就能在任何地方充分利用Spring的...

    Springboot实现多线程注入bean的工具类操作

    在Spring Boot应用中,我们经常需要在多线程环境下使用由Spring管理的bean。由于线程池中的工作线程并不直接由Spring容器管理,因此不能像单线程环境那样直接通过`@Autowired`注解来注入bean。为了解决这个问题,...

    java 后端学习资料包含(spring,多线程).zip

    Spring框架和多线程是Java后端开发中的两大核心知识点。本资料包将深入探讨这两个主题,帮助开发者提升技能水平。 Spring框架是Java企业级应用的事实标准,它提供了一个全面的编程和配置模型,简化了Java应用程序的...

    spring在@Bean注解中initMethod调用方法异步

    在Spring框架中,`@Bean`注解是一个关键的组件,用于声明一个方法将返回的对象作为Spring容器中的bean。在`@Bean`中定义`initMethod`属性,可以指定该bean初始化时需要调用的方法。当`initMethod`被设置为异步执行,...

    架构师学习线路图,详细介绍java学习线路图,包括java多线程并发,JVM,spring,springboot,s.zip

    1. **Java多线程并发**:在Java中,多线程并发是性能优化的关键。它允许程序同时执行多个任务,提高系统的资源利用率。Java提供了多种创建和管理线程的方式,如Thread类、Runnable接口、Executor框架等。理解线程...

    spring4+junit4.8 +多线程TheadTool

    Spring框架提供的`org.mockito`库和`@MockBean`注解可以帮助我们在测试中创建和注入mock对象,避免真实线程之间的交互影响测试结果。 通过这些技术的结合,我们可以构建高效、可测试的多线程应用。在Spring4和JUnit...

    多线程及spring相关面试专题及答案.zip

    在IT行业中,多线程和Spring框架是...综上所述,多线程和Spring框架是Java后端开发中的重要组成部分。理解并掌握这些知识点,对于提升系统性能和解决并发问题具有重大意义,同时也有助于在面试中展现出深厚的技术功底。

    maven管理的Spring多线程任务demo

    本示例"maven管理的Spring多线程任务demo"着重展示了如何在Spring框架中利用Maven进行项目构建,并实现多线程任务处理。在SSM(Spring、SpringMVC、MyBatis)框架背景下,如果你已经有所了解,那么这个例子将帮助你...

    Spring项目bean基础配置代码

    在Spring框架中,Bean是核心概念,它是Java对象在Spring容器中的实例,通过XML或Java配置来定义。本文将深入探讨Spring项目中的Bean基础配置、别名配置以及作用范围配置。 首先,我们来理解Bean的基础配置。在...

    解决Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程问题

    在代码中定义了一个名为springSessionRedisTaskExecutor的Bean,这个线程池会预设核心线程数、最大线程数、线程存活时间、队列容量以及线程名前缀。通过设置这些参数,可以有效控制线程的创建和回收,避免了无限制地...

    java面试宝典,包含java基础篇、多线程、spring、springboot、mysql、redis、mq等等经典面试问题

    这份资源包含了Java基础、多线程、Spring框架、Spring Boot、MySQL数据库、Redis缓存以及消息队列MQ等多个核心知识点,每个部分都涵盖了经典且常见的面试问题。 1. **Java基础篇**: - 内存模型:了解JVM内存结构...

    spring-boot-multithreading.zip_spring boot_多线程

    总结起来,Spring Boot通过其对Java并发库的支持和自身提供的异步处理机制,使得开发人员能轻松地在应用中引入多线程。通过合理配置线程池和使用`@Async`注解,可以有效地实现任务的并发执行,提高应用性能。在`...

    基于Spring+Ibatis的安全线程实现

    1. **ThreadLocal**: Spring提供了ThreadLocalRequestContext,它可以存储并隔离每个线程的请求上下文,例如当前用户信息,避免了多线程环境中的数据污染。在Service层或Controller层,我们可以利用ThreadLocal来...

    java spring 多数据源

    在Java Spring框架中,多数据源的实现是一个重要的特性,特别是在大型企业级应用中,它允许应用程序连接到多个数据库,从而实现数据隔离、负载均衡或读写分离等高级功能。本教程将深入探讨如何在Spring中配置和管理...

    Spring JavaConfig指南

    JavaConfig是Spring框架下的一个子项目,它提供了一种全新的方式来配置Spring容器中的Bean,这种方式不再依赖于XML配置文件,而是利用Java语言本身的特性(如注解)来进行Bean的定义、装配和管理。JavaConfig的出现...

Global site tag (gtag.js) - Google Analytics