线程中无法通过spring注入services为null

深谷不见幽兰 发布于 2013/12/03 14:15
阅读 6K+
收藏 2

【华为云1024程序员节·向云而生】预约直播 抽14件华为电子产品礼包!>>>

一个javaweb的项目,在web.xml中设置一个监听

<listener>

     <listener-class>com.thread.MyListener</listener-class>  

    </listener>

下面是监听类中的方法

public class MyListener implements ServletContextListener{
private MyThread myThread; 

 
    public void contextDestroyed(ServletContextEvent e) {  
        if (myThread != null && myThread.isInterrupted()) {  
            myThread.interrupt();  
        }  
    }  
  
    public void contextInitialized(ServletContextEvent e) {  
        String str = null;  
        if (str == null && myThread == null) {  
            myThread = new MyThread();  
            myThread.start(); 
        }  
    }  
}

下面是生成的线程,这里的services为空

public class MyThread extends Thread{
private  CommandTextService commandTextService;
public void run() {    
        if(commandTextService==null){
        System.out.print("commandTextService为空");
        }
        }
public CommandTextService getCommandTextService() {
return commandTextService;
}
public void setCommandTextService(CommandTextService commandTextService) {
this.commandTextService = commandTextService;
}  



}

spring中我也加了一个bean了

    <bean id="myThread" class="com.thread.MyThread" scope="prototype">
    <property name="commandTextService" ref="commandTextService"></property>
    </bean>
在网上也有好多方法,比如在线程类中定义CommandTextService时候,加个static,试过了没有用。也用ApplicationContext来获得bean的方法,可是这里总是报没有commandTextService名字的bean

希望大伙帮忙解惑,如果能给我一个解决方案,万分感激

加载中
0
深谷不见幽兰
深谷不见幽兰
自己顶一个,大侠在哪里
0
huan
huan

使用spring 一定要注意bean的scope和生命周期,你这里所有的类都不在spring的管理范围内(myThread = new MyThread();  ) 是不可能获取到spring定义的实例的。

你的listener唯一的作用就是在容器启动时实例化一个Mythread,在spring中有很多方法可以做到,可以不使用listener,如果一定要用,就要保证spring容器用listener首先初始化,然后从servletContext 中获得spring的 WebApplicationContext

0
skyline520
skyline520
http://my.oschina.net/skyline520/blog/181158 
看这篇文章,相信对你有帮助
skyline520
skyline520
回复 @liulong_up : 你是想在启动的时在程序启动的时候启动这个线程吧,是跟你的程序启动方式有关,待会我给你上段伪代码
深谷不见幽兰
深谷不见幽兰
我按照你的说法配置了,但得到bean的时候,抛出java.lang.NullPointerException。也就是getBean()方法无法获得bean,我spring中也配置好了,就是得不到bean,不知什么原因
0
skyline520
skyline520
http://my.oschina.net/skyline520/blog/95151 
参考这篇文章
然后 看下面代码,以下程序会保证你的线程在服务启动时就启动了
package com.skyline.upload.listener;

import org.springframework.beans.factory.InitializingBean;

/**
 * 这个类可以注入一些 dao 工具类
 * 在 afterPropertiesSet 方法中执行数据库连接级别的操作
 * Author: skyline{http://my.oschina.net/skyline520}
 * Created: 13-6-12 下午7:41
 */
public class UploadOnLoadListener implements InitializingBean {

    private CommandTextService commandTextService;

    public void setCommandTextService(CommandTextService commandTextService) {
        this.commandTextService = commandTextService;
    }

    public void close(){
    }
    public void afterPropertiesSet() throws Exception {
        //在这里启动你的线程 
        //方式1 利用构造方法把bean传递过去
        new Thread(commandTextService);
        //方式2 在thread 内部使用我之前说的获取bean的方式 
        new Thread();
    }
}

然后spring 配置文件中要配置 

<bean id="uploadOnLoadlister" class="com.skyline.upload.listener.UploadOnLoadListener" lazy-init="false" destroy-method="close"/>
深谷不见幽兰
深谷不见幽兰
非常感谢,问题已经解决了,谢谢你的帮助
返回顶部
顶部