在一个普通类中使用bean,代码如下:
public class ReceiveThread extends Thread { @Autowired private ApplicationContext ctx; ConcentratorService concentratorService; public void init() { ctx = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/config/datasource.xml"); concentratorService =(ConcentratorService) ctx.getBean("concentratorService"); } public void run() { String macAddr="12:12:12:12:12:12"; Concentrator c=concentratorService.findConcentratorByCaddress(macAddr); } }
运行多线程之后,service被成功注入了,但是dao为空的。
ConcentratorService中的findConcentratorByCaddress函数如下:
@Service("ConcentratorService") public class ConcentratorServiceImpl implements ConcentratorService{ @Autowired ConcentratorDao concentratorDao; public Concentrator findConcentratorByCaddress(String caddress) throws Exception{ // TODO Auto-generated method stub return concentratorDao.findConcentratorByCaddress(caddress); } }
各位,求救!
============更新内容============
ConcentratorDao:(ConcentratorService雷同,只是把Dao改成Service)
public interface ConcentratorDao { public ListgetConcentratorListByMacAddresses(String[] macAddr) throws Exception; }
datasource.xml片段
我认为大概这种情况下可能会出现 dao 为空
@Bean
ConcentratorDao concetratorDao() {
// 某个逻辑下
return null;
}
要不然可能就是自己的代码改了 dao 值
你这个逻辑写的让人真的看不懂啊。
@Autowired private ApplicationContext ctx;
注入ApplicationContext
。
ctx = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/config/datasource.xml");
这个又是啥意思?
另外你的ConcentratorServiceImpl
真的有被IoC
容器管理吗?如果被IoC
容器管理而未找到concentratorDao
,又没有在@Autowired
上设置required=false
。这种情况concentratorDao
不可能会为null
的吧,spring
找不到对应的bean依赖,应该会直接出现Dependency Exception
才正确。
两种方式
1.每次调用这个你所谓的普通类的方法时,在外部依赖dao
,把dao
实例传进来,并且删掉这个普通类里的关于spring
的代码.
2.把你这个普通类加注解@Component
,使当前类被spring
管理,给scope
为多例,并在类里依赖注入你的dao
及service
.
先在spring中加上这个bean:
然后在你要使用线程的类里面注入
用直接就是executor.execute();
我这个蠢人= =,当时脑袋是吃屎了。搅在一块了,把问题复杂化。真是辛苦了认真回答我这个脑残的问题的各位。
问题的根本原因是,我获取ApplicationContext引用错了xml!!!!
今天因为要重新解决这个问题。不知道为什么地就发现我这个web项目需要的xml被分成了俩,并被整合到了一个叫root_context.xml的文件中去了。所以!代码应该改成:
ApplicationContext ctx = new FileSystemXmlApplicationContext("/WebRoot/WEB-INF/config/root_context.xml"); concentratorService =(ConcentratorService) ctx.getBean("concentratorService");
才对,之后就能畅通无阻得使用bean了。希望看到这里,和我犯同样问题的鞋童们(大概只有我吧)好好反省反省自己。