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

摘要:
原因分析当web容器启动应用程序时,它不会提前将线程中的bean注入解决方案。有很多解决方案,我们在互联网上看到了很多。在每个线程中使用静态方法直接检索的容器中的Spring对象。使用静态方法获取容器中的弹簧对象。参见参考文献http://littie1987.iteye.com/blog/937877或http://my.oschina.net/skyline520/blog/181158?p={{page}}但请记住,您还必须在春季将此工具类配置为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();  
    }  

在Spring中注册工具类的bean 

<bean class="com.xxx.spring.SpringApplicationContextHolder" />  

线程中获取bean 

UserRepo user = (UserRepo) SpringApplicationContextHolder.getSpringBean("userRepo"); 

 

免责声明:文章转载自《Java(多)线程中注入Spring的Bean》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇工控安全入门分析windows环境下简单Jenkins持续集成搭建下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

多线程中的lua同步问题

最近写paintsnow::start时出现了一个非常麻烦的BUG,程序的Release版本大约每运行十几次就会有一次启动时崩溃(Debug版本还没崩溃过),崩溃点也不固定。经过简单分析之后,确定是线程同步的问题。于是便修改了线程通信的代码,并使用pthread_mutex_lock/unlock来防止冲突。重新编译后,崩溃频率有所减少。但是每运行约四十次...

java内存及数据区

Java运行时的数据区包括:(其中前两个是线程共享的) 1.方法区(Method Area) 存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据 2.堆(Heap) 存放对象实例,几乎所有对象实例都在这里分配内存 3.虚拟机栈(VM Stack) 描述的是Java方法执行的内存模型:每个方法在执行的同时会创建一个Stack Fram...

SpringBoot项目中@Async方法没有执行的问题分析

现象:      1. 表面现象: 方法中输出的日志, 日志文件中找不到, 也没有任何报错(即@Async标注的方法没有执行, 也没有报错)     2. 分析现象: 日志中某个时刻之后没有了task-xxx线程的日志   原因:      @Async异步方法默认使用Spring创建ThreadPoolTaskExecutor(参考TaskExecut...

全网最通俗易懂理清mybatis中SqlSession、SqlSessionTemplate、SessionFactory和SqlSessionFactoryBean之间的关系

摘自:https://www.cnblogs.com/xiaoming0601/p/12166160.html 我潇洒的灰大狼又回来啦。今天送大家的一句话是: 保持耐心,永远年轻,永远热泪盈眶。 前言 先容我哭一会儿,呜呜呜~昨晚写了一半的文章,还没保存就盖上盖子准备回家,拔下电源准备把电脑塞进书包带回家完成时,懒惰阻止了我,最终还是没带回家,于是,遭报...

Run Loop

学习过程中,将Threading PG中的Run Loops翻译了下,权当是做为笔记。原文见 Run Loops。 20110526 转载请注明,谢谢。 http://www.cnblogs.com/scorpiozj/ Run loops是线程的基础架构部分。一个run loop就是一个事件处理循环,用来不停的调配工作以及处理输入事件。使用run loo...

10 : mysql 主从复制

延时从库 主从复制很好的解决了物理损坏,但是如果主库有个误删除写入的操作怎么办? 正常情况下从库也会同步这个错误的,企业中应该怎么避免这个情况?这个时候就需要使用延时同步来解决: 延时从库?delay(延时)从节点同步数据。 对SQL线程进行延时设置。IO线程正常的执行。企业中一般延迟3-6小时 延时从库的配置过程:mysql>stop slave;...