最近在做系統改造的時候,還遇到了一個問題是,如何集成Spring Struts2和Hessian。
當配置Spring和Struts2的時候,在web.xml做了如下配置:
<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:
<constant name="struts.objectFactory" value="spring" />
這樣,Struts2就可以使用Spring上下文環境中的action bean了。
但在配置Hessian的時候,以前在web.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> </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的重複。
爲了解決這個問題,在配置Hessian時,做了一下修改,如下:
<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上下文環境,即使用同一個上下文環境。