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分的。我的结贴率也不用怀疑
标准的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分的。我的结贴率也不用怀疑
在配置文件里这样写:
<bean id="CameraService"
class="*.QuerynuminfoServiceImpl">
<property name="cameraDAO" ref="cameraDAO"/>
</bean>在类里直接 把cameraDAO当成属性,并提供getter setter方法即可实现注入。
一直都是这样配置的。
如果在action里面你可以直接拿来就用,因为SupperAction帮你去取CameraService出来。
但是在非action里,就得通过ApplicationContext去getBean("CameraService")了
这句话好像不太对.! 我以前看过源码的还有点印象, 不知道记错没有. Spring好像是在getBean(key)的时候,去一个Map集合里找, 如果没有的话才会实例化, 实例化这个Bean对象的时候,会去检查它是否实现了ApplicationContextAware,如果实现了就会给它注入Spring容器.! 而不是在初始化就会注入喔.!想了解更深的话去翻源码吧.! 我也是以前学习的时候翻得..现在记得得不多了
问题:1。什么意思呢?spring容器启动初始化2次?还是bean被初始化2次?
2。真的是初始化2次吗,有没有测试过
会启动了2次的。简单的测试,写个spring的定时器。或者用spring的hibernate。 明显看出有2次
一次是正常SSH的,一次是方法1的