spring非action使用service的问题,ApplicationContextAware返回null

people01 2010-06-08 03:27:29
Struts2.0 Hibernate3.0 Spring 2.5
标准的SSH。普通的action service dao等一切都是正常可以用的。

现在由于业务需要,有几个类和方法也需要用到dao,
不过不是action,不然就简单的。这几个类是API的,给他人调用的。

我开始,是使用http://www.blogjava.net/Todd/archive/2010/04/22/295112.html里面的方法二。
正常,可以实现

tring[] application = {Constants.APPLICATION_CONTEXT, Constants.APPLICATION_CONTEXT_DAO};
public ApplicationContext ctx = new FileSystemXmlApplicationContext(application);
cameraClient = (CameraClient) ctx.getBean("CameraClient");


不过这样有缺点的,因为Spring初始化了2次。一次是web.xml里面配置的,随系统启动了。还有这里又初始化一次。

为了优化,所以这个要改进。


然后我尝试方法三 四 五(方法二我也成功的,不过是用在一个ContextLoaderListener里面)
其实三四五都一样的。WebApplicationObjectSupport extends ApplicationObjectSupport,而ApplicationObjectSupport是implements ApplicationContextAware的,等于都是在ApplicationContextAware里面,在Spring初始化时,会通过该方法将ApplicationContext对象注入。


public class CameraService implements ApplicationContextAware{

private ApplicationContext ac;

public void setApplicationContext(ApplicationContext ac)throws BeansException {
this.ac = ac;
}
....XXX...
public void SessionClose(String ipAddress){

cameraDAO = (CameraDAO) ac.getBean("CameraDAO");

这样,我也实现了。
但是接下来问题来了。我是要在非action里面,就是普通的类使用CameraService,但是现在ApplicationContext 是null,自然也就无法getBean("CameraService");

通过debug发现。如果是正常的service里面,会先执行setApplicationContext,所以ApplicationContext 初始化的。
但是普通类里,就没有执行这一步。不知道 为什么。

说了,那么多。希望高手帮忙下,分不够还可以开贴补。暂时等级只够发100分的。我的结贴率也不用怀疑

...全文
684 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
佐剑 2012-11-08
  • 打赏
  • 举报
回复
如果default-lazy-init ="false" 太慢就在bean上设置lazy-init ="false" OK
佐剑 2012-11-08
  • 打赏
  • 举报
回复
default-lazy-init ="false" 就好了!
SDMRauquin 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 tangyanbo1110 的回复:]

引用:不过这样有缺点的,因为Spring初始化了2次。一次是web.xml里面配置的,随系统启动了。还有这里又初始化一次。
问题:1。什么意思呢?spring容器启动初始化2次?还是bean被初始化2次?
2。真的是初始化2次吗,有没有测试过
[/Quote]

会启动了2次的。简单的测试,写个spring的定时器。或者用spring的hibernate。 明显看出有2次
一次是正常SSH的,一次是方法1的
风过无痕1110 2010-06-09
  • 打赏
  • 举报
回复
引用:不过这样有缺点的,因为Spring初始化了2次。一次是web.xml里面配置的,随系统启动了。还有这里又初始化一次。
问题:1。什么意思呢?spring容器启动初始化2次?还是bean被初始化2次?
2。真的是初始化2次吗,有没有测试过
people01 2010-06-09
  • 打赏
  • 举报
回复
我也知道是null,问题是问什么同样的写法,service成功了,非action却失败了
Pbulic 2010-06-09
  • 打赏
  • 举报
回复
没搞明白,再顶一下
SDMRauquin 2010-06-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mochibing 的回复:]

如果是单纯的把dao或service注入到一个类(不管是action还是非action)中,4楼的写法是正确的,因为spring的依赖注入是通过java的反射机制完成的,通过setter方式肯定是可以注入的。我想楼主的意思是怎么在非action类中获取到spring的上下文吧?
[/Quote]
非action的话,你的service为null的,根本没有能够注入,得先拿到ApplicationContext才能getBean("xxxService")
mochibing 2010-06-09
  • 打赏
  • 举报
回复
如果是单纯的把dao或service注入到一个类(不管是action还是非action)中,4楼的写法是正确的,因为spring的依赖注入是通过java的反射机制完成的,通过setter方式肯定是可以注入的。我想楼主的意思是怎么在非action类中获取到spring的上下文吧?
people01 2010-06-09
  • 打赏
  • 举报
回复
早起的鸟儿有虫子吃
zihuzihuzihu 2010-06-08
  • 打赏
  • 举报
回复
colin_pxx 2010-06-08
  • 打赏
  • 举报
回复
要下班了帮顶一下
zhou961270 2010-06-08
  • 打赏
  • 举报
回复
学习!!
izard999 2010-06-08
  • 打赏
  • 举报
回复
我的意思是说,只有当你拿到Spring的容器去getBean的时候, Spring才会给你注入ApplicationContext的.! 所以你肯定是要拿Spring的容器去取对象滴
people01 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 izard999 的回复:]

在Spring初始化时,会通过该方法将ApplicationContext对象注入。
这句话好像不太对.! 我以前看过源码的还有点印象, 不知道记错没有. Spring好像是在getBean(key)的时候,去一个Map集合里找, 如果没有的话才会实例化, 实例化这个Bean对象的时候,会去检查它是否实现了ApplicationContextAware,如果实现了就会给它注入Spring容……
[/Quote]
大侠。。现在不是为了学习,而是为了解决问题。。。
当然有个负责的心,不然功能早实现了,想稍微优化些罢了
izard999 2010-06-08
  • 打赏
  • 举报
回复
在Spring初始化时,会通过该方法将ApplicationContext对象注入。
这句话好像不太对.! 我以前看过源码的还有点印象, 不知道记错没有. Spring好像是在getBean(key)的时候,去一个Map集合里找, 如果没有的话才会实例化, 实例化这个Bean对象的时候,会去检查它是否实现了ApplicationContextAware,如果实现了就会给它注入Spring容器.! 而不是在初始化就会注入喔.!

想了解更深的话去翻源码吧.! 我也是以前学习的时候翻得..现在记得得不多了
people01 2010-06-08
  • 打赏
  • 举报
回复
自己up
people01 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 xyylove520 的回复:]

XML code

在配置文件里这样写:
<bean id="CameraService"
class="*.QuerynuminfoServiceImpl">
<property name="cameraDAO" ref="cameraDAO"/>
</bean>


在类里直接 把cameraDAO当成属性,并提供getter setter方法即可……
[/Quote]

一直都是这样配置的。
如果在action里面你可以直接拿来就用,因为SupperAction帮你去取CameraService出来。
但是在非action里,就得通过ApplicationContext去getBean("CameraService")了
people01 2010-06-08
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lq282514781 的回复:]

用application的作用域去读取
[/Quote]
稍微在提示一句,不是很明白
2010-06-08
  • 打赏
  • 举报
回复

在配置文件里这样写:
<bean id="CameraService"
class="*.QuerynuminfoServiceImpl">
<property name="cameraDAO" ref="cameraDAO"/>
</bean>

在类里直接 把cameraDAO当成属性,并提供getter setter方法即可实现注入。
lq282514781 2010-06-08
  • 打赏
  • 举报
回复
用application的作用域去读取
加载更多回复(2)

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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