hibernate Spring 框架下,IOC注入以及事务的问题. 50
系统有轮询程序定时执行任务.在轮询Poller类里用@Resource引入了AService.AService本身的注解是@Service和@Transactional,...
系统有轮询程序定时执行任务.在轮询Poller类里用@Resource引入了AService.
AService本身的注解是@Service 和@Transactional,Service里面有用@Resource引入了的其他Sevice和Dao.
开始的时候没有加@Transactional,系统运行时候提示no Session bound Thread(这个时候所有的注入都是正常的.)
后来加上注解@Transactional
当执行任务时,Aservice里面所有用@Resource引入的全为 null;在Aservice里面执行this.dao.update()报控指针.
到后面我发现改成 this.getDao.update().就能正常执行了.
之所以我发现能这么调用是因为我发现往AService对象里面set值set不进去,进入set方法前为属性空,进入set方法里,属性有值,出了set方法值又为空了.打断点的话,发现set方法并不是直接执行,貌似还经过代理.我就想到用this.getDao()代替this.dao去执行调用.
最后就出现了奇怪的情况,在Poller里面的AService对象本身用@Resource正常注入了,但是它的@Resource注解的属性 (例如dao)却是空,同时,却又可以通过get方法(如getDao())获取到正常的对象去调用.
这是什么情况?我感觉是和代理有关,有高手指点一下么? 展开
AService本身的注解是@Service 和@Transactional,Service里面有用@Resource引入了的其他Sevice和Dao.
开始的时候没有加@Transactional,系统运行时候提示no Session bound Thread(这个时候所有的注入都是正常的.)
后来加上注解@Transactional
当执行任务时,Aservice里面所有用@Resource引入的全为 null;在Aservice里面执行this.dao.update()报控指针.
到后面我发现改成 this.getDao.update().就能正常执行了.
之所以我发现能这么调用是因为我发现往AService对象里面set值set不进去,进入set方法前为属性空,进入set方法里,属性有值,出了set方法值又为空了.打断点的话,发现set方法并不是直接执行,貌似还经过代理.我就想到用this.getDao()代替this.dao去执行调用.
最后就出现了奇怪的情况,在Poller里面的AService对象本身用@Resource正常注入了,但是它的@Resource注解的属性 (例如dao)却是空,同时,却又可以通过get方法(如getDao())获取到正常的对象去调用.
这是什么情况?我感觉是和代理有关,有高手指点一下么? 展开
- 你的回答被采纳后将获得:
- 系统奖励15(财富值+成长值)+难题奖励10(财富值+成长值)+提问者悬赏50(财富值+成长值)
1个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询