有几种方式??
1. 使用web.xml的<listener>方式引入并初始化ApplicationContext:
<context-param>
</context-param>
<listener>
</listener>
2. 使用web.xml的<servlet>方式引入并初始化ApplicationContext:
<context-param>
</context-param>
<servlet>
</servlet>
3. 在struts-config.xml中以<plug-in>引入并初始化ApplicationContext:
<plug-in className="org.springframework.web.struts.ContextLoaderPlugIn">
</plug-in>
二.struts引入spring的ApplicationContext后,如何在struts的Action中使用ApplicationContext??
1. 如果使用web.xml的<servlet>或者<listener>方式引入并初始化ApplicationContext的,
因配置文件的位置就写在web.xml的参数contextConfigLocation中,所以获取了servletContext就行了,
在struts的action中获取ApplicationContext的方法如下:
WebApplicationContext wac
2. 但如果是在struts-config.xml中以<plug-in>引入并初始化ApplicationContext的,
其实质是spring为struts提供的一个ContextLoaderPlugIn类,此类也可以加载context的xml文件。
因为配置文件的位置不是写在web.xml中,而在struts-config.xml中,引而不能直接使用上面的方法,但是也需要获取了servletContext,
那么,在struts的action中获取ApplicationContext的方法如下:
WebApplicationContext context
3.在以上三种方式下都适用的方法:
applicationContext app
1. 第一,二种方法的区别在于,两种方式加载的WebApplicationContext,以不同的Key存放在ServletContext中。而如果你定义了HibernateFilter的话,spring会利用WebApplicationContextUti
2. 第三种方法的缺点很明显, 指明配置文件所在,耦合性增强了.
3. 有人可能会怀疑第三种情况效率是否会低,因为第三种方法以配置文件为参数,是否意味着每次都会重新从XML文件中加载所有的bean,但事实上不是这样.spring的设计就是要在启动的时候加载配置文件,当web中再无论是用applicationContext或者是WebApplicationContext获得beans时都不会重新加载配置文件.
虽然上述实现了在action中使用ApplicationContext,但是这样做,和继承spring提供的ActionSupport类没什么区别,因为这样做,同样是引入了spring的类,至少也引入了ApplicationContext类,同样是使得Struts与Spring紧密耦合,而且action中引入ApplicationContext目的是获取Spring管理的bean,这样子,action类也负责了查找Spring管理的bean,这违背了控制反转(IOC)的原则。所以一般情况下,不要在Action中引入ApplicationContext。
建议采用另一种Struts-Spring集成方式,即使用Spring的DelegatingActionProxy代理类,利用IOC将你想使用的bean以注入到Action中,而不是在Action中使用ApplicationContext获取你想要的bean。