最近在作系統改造的時候,還遇到了一個問題是,如何集成Spring Struts2和Hessian。web
當配置Spring和Struts2的時候,在web.xml作了以下配置:spring
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/spring/*.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener>
經過設置listener加載Spring的上下文環境,並在struts.xml中設置對象工廠爲Spring:app
<constant name="struts.objectFactory" value="spring" />
這樣,Struts2就能夠使用Spring上下文環境中的action bean了。ide
但在配置Hessian的時候,之前在web.xml中是這樣配置的:url
<servlet> <servlet-name>Remoting</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/spring/*.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Remoting</servlet-name> <url-pattern>/remoting/*</url-pattern> </servlet-mapping>
在初始化Hessian的servlet的時候又一次把Spring配置文件做爲參數,這樣又會從新生成一個Spring上下文環境,致使Spring中bean的重複。spa
爲了解決這個問題,在配置Hessian時,作了一下修改,以下:xml
<servlet> <servlet-name>Remoting</servlet-name> <servlet-class> org.springframework.web.servlet.DispatcherServlet </servlet-class> <init-param> <!-- <param-name>contextConfigLocation</param-name> <param-value>classpath:/spring/*.xml</param-value> --> <!-- 該servlet的spring上下文采用WebApplicationContext,再也不重複生成上下文 --> <param-name>contextAttribute</param-name> <param-value> org.springframework.web.context.WebApplicationContext.ROOT </param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>
即在初始化Hessian時再也不傳入Spring配置文件,而是傳入經過listener初始化的Spring WebApplicationContext上下文環境,即便用同一個上下文環境。
對象