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分的。我的结贴率也不用怀疑

解决方案 »

  1.   

    初始化一个 bean 把dao注入进去就可以了吧?想想你的server层是怎么把dao注入进去的,原理是一样的.
      

  2.   

    我明白原理一样,写法配置都一样。但是在service进去了,这个普通的类就是没有,ac是null的
      

  3.   


    在配置文件里这样写:
    <bean id="CameraService"
    class="*.QuerynuminfoServiceImpl">
    <property name="cameraDAO" ref="cameraDAO"/>
    </bean>在类里直接 把cameraDAO当成属性,并提供getter setter方法即可实现注入。
      

  4.   


    一直都是这样配置的。
    如果在action里面你可以直接拿来就用,因为SupperAction帮你去取CameraService出来。
    但是在非action里,就得通过ApplicationContext去getBean("CameraService")了
      

  5.   

    在Spring初始化时,会通过该方法将ApplicationContext对象注入。
    这句话好像不太对.!  我以前看过源码的还有点印象, 不知道记错没有.  Spring好像是在getBean(key)的时候,去一个Map集合里找, 如果没有的话才会实例化, 实例化这个Bean对象的时候,会去检查它是否实现了ApplicationContextAware,如果实现了就会给它注入Spring容器.! 而不是在初始化就会注入喔.!想了解更深的话去翻源码吧.! 我也是以前学习的时候翻得..现在记得得不多了
      

  6.   

    我的意思是说,只有当你拿到Spring的容器去getBean的时候, Spring才会给你注入ApplicationContext的.!  所以你肯定是要拿Spring的容器去取对象滴
      

  7.   

    如果是单纯的把dao或service注入到一个类(不管是action还是非action)中,4楼的写法是正确的,因为spring的依赖注入是通过java的反射机制完成的,通过setter方式肯定是可以注入的。我想楼主的意思是怎么在非action类中获取到spring的上下文吧?
      

  8.   

    非action的话,你的service为null的,根本没有能够注入,得先拿到ApplicationContext才能getBean("xxxService")
      

  9.   

    我也知道是null,问题是问什么同样的写法,service成功了,非action却失败了
      

  10.   

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

  11.   


    会启动了2次的。简单的测试,写个spring的定时器。或者用spring的hibernate。 明显看出有2次
    一次是正常SSH的,一次是方法1的
      

  12.   

    default-lazy-init ="false" 就好了!
      

  13.   

    如果default-lazy-init ="false" 太慢就在bean上设置lazy-init ="false" OK