Spring中多线程注入SqlService注不进去,显示sqlService为null异常

iverylovecsharp 2010-03-08 07:00:01
public class AutoRun implements Runnable {

@Resource
private SqlService sqlService;

public void setSqlService(SqlService sqlService) {
this.sqlService = sqlService;
}

public void run() {
while (true) {
try {

String a = new Date().toLocaleString();
sqlService.read("select '"+a+"' from dual");

System.out.println(a);

Thread.sleep(100);// 休眠2分钟

} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}

}
}
}


Spring中多线程注入SqlService注不进去,显示sqlService为null异常,而在普通Action中可以注入,请问这是为什么?
...全文
1489 41 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuboqiang7 2012-09-26
  • 打赏
  • 举报
回复
是不是切面的方法没配置。。。我刚才和你一样。。也是注入不到service。。。结果我的方法在配置切面的地方没有造成的。。
jiugongz2010 2012-04-16
  • 打赏
  • 举报
回复
因为线程是一个普通的java类,你new了一个线程,所以service层获取为null,需重新获取spring bean才可以。

ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
bjamosgavin 2011-01-09
  • 打赏
  • 举报
回复
[Quote=引用楼主 iverylovecsharp 的回复:]
Java code
public class AutoRun implements Runnable {

@Resource
private SqlService sqlService;

public void setSqlService(SqlService sqlService) {
this.sqlService = sqlS……
[/Quote]

属性改成静态的
private static SqlService sqlService;
public SqlService getSqlService() {
return sqlService;
}
public void setSqlService(SqlService sqlService) {
CustomerchangeThread.sqlService = sqlService;
}
用我解释么?
woshiqinsheng 2010-03-23
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 iverylovecsharp 的回复:]

启动:
Java code
AutoRun workSyp = new AutoRun();
Thread work = new Thread(workSyp);
work.start();
[/Quote]
workSyp不用new创建,同样用spring注入试试
iverylovecsharp 2010-03-19
  • 打赏
  • 举报
回复
不能完全用注入来实现?
iverylovecsharp 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 zhang116868 的回复:]
引用 27 楼 iverylovecsharp 的回复:
23楼:
lz不会是先让线程转起来,再set的吧?

不是这样的

25楼:
肯定是线程启动时,没有使用到spring的容器,,,因为线程没有通过spring容器,所以也就找不到service,故为NUll

这个问题么样处理


Java code

//得到容器
ApplicationContext con……
[/Quote]

不能完全用记录来实现?
海会圣贤 2010-03-18
  • 打赏
  • 举报
回复
用这个:

[Quote=引用 33 楼 zhang116868 的回复:]
引用 27 楼 iverylovecsharp 的回复:
23楼:
lz不会是先让线程转起来,再set的吧?

不是这样的

25楼:
肯定是线程启动时,没有使用到spring的容器,,,因为线程没有通过spring容器,所以也就找不到service,故为NUll

这个问题么样处理


Java code

//得到容器
ApplicationContext con……
[/Quote]

你这样不行的:

[Quote=引用 30 楼 iverylovecsharp 的回复:]
启动:

Java code
AutoRun workSyp = new AutoRun();
Thread work = new Thread(workSyp);
work.start();
[/Quote]
海会圣贤 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 iverylovecsharp 的回复:]
23楼:
lz不会是先让线程转起来,再set的吧?

不是这样的

25楼:
肯定是线程启动时,没有使用到spring的容器,,,因为线程没有通过spring容器,所以也就找不到service,故为NUll

这个问题么样处理
[/Quote]


//得到容器
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
//使用容器调用bean
RagBady bady=(RagBady)context.getBean("rag");

//或用这种方法用行:
Resource resource=new ClassPathResource("applicationContext.xml");
BeanFactory factory=new XmlBeanFactory(resource);
CapGun capgun=(CapGun)factory.getBean("cap");
海会圣贤 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 coolwzjcool 的回复:]
肯定是线程启动时,没有使用到spring的容器,,,因为线程没有通过spring容器,所以也就找不到service,故为NUll
[/Quote]

应该是这个问题。
hxhappy 2010-03-18
  • 打赏
  • 举报
回复
你在DAO层里试试用spring的定时器试试 可以绕过注入
iverylovecsharp 2010-03-18
  • 打赏
  • 举报
回复
没看太明白
iverylovecsharp 2010-03-17
  • 打赏
  • 举报
回复
启动:
AutoRun workSyp = new AutoRun();
Thread work = new Thread(workSyp);
work.start();
aSysBang 2010-03-17
  • 打赏
  • 举报
回复
AutoRun 这个你是怎么启动线程的?
不会是new AutoRun()出来的吧?
iverylovecsharp 2010-03-17
  • 打赏
  • 举报
回复
再顶一顶,要么样办啊
huanyouyu 2010-03-16
  • 打赏
  • 举报
回复
那试一下其它的注入能不能成功呢?是不是Spring监听没有配置呢?
villagehead 2010-03-16
  • 打赏
  • 举报
回复
lz不会是先让线程转起来,再set的吧?

good luck
iverylovecsharp 2010-03-16
  • 打赏
  • 举报
回复
如果使用构造器,在另一个类里调用到sqlService获取后传过来可以,直接在bean里配置不行
xiangping1990 2010-03-16
  • 打赏
  • 举报
回复
你用构造器注入方式 试一下
iverylovecsharp 2010-03-16
  • 打赏
  • 举报
回复
public class AutoRun implements Runnable {

@Resource
private SqlService sqlService;

public void setSqlService(SqlService sqlService) {
this.sqlService = sqlService;
}

public void run() {
while (true) {
try {

String a = new Date().toLocaleString();
sqlService.read("select '"+a+"' from dual");

System.out.println(a);

Thread.sleep(100);// 休眠2分钟

} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}

}
}
}
呼吸先生 2010-03-16
  • 打赏
  • 举报
回复
调用的代码贴出来啊。。
加载更多回复(21)

81,117

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧