02 3月 2007

Struts2 Note -- (2)整合Spring2

2.0.6與之前版本整合的設定 2.0.6與之前版本的整合方式有很大不同,而整合的Spring版本也從1.2.8到了2.0.1 2.0.6將org.apache.struts2.spring.StrutsSpringObjectFactory自struts2-core移至struts2-spring-plugin, 所以必需要加入struts2-spring-plugin的Library.使用Maven2的可以這樣設定 pom.xml
<dependency>
 <groupId>org.apache.struts</groupId>
 <artifactId>struts2-spring-plugin</artifactId>
 <version>2.0.6</version>
</dependency>
2.0.6與之前的版本皆需在struts.propertis中設定
struts.objectFactory = spring
struts2-spring-plugin中除了org.apache.struts2.spring.StrutsSpringObjectFactory這個主要java外, 另外有的就是一個struts-plugin.xml,設定了struts.objectFactory真正使用的Class struts-plugin.xml
<struts>
    <bean type="com.opensymphony.xwork2.ObjectFactory" name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" />
    
    <!--  Make the Spring object factory the automatic default -->
    <constant name="struts.objectFactory" value="spring" />

    <package name="spring-default">
        <interceptors>
            <interceptor name="autowiring" class="com.opensymphony.xwork2.spring.interceptor.ActionAutowiringInterceptor"/>
            <interceptor name="sessionAutowiring" class="org.apache.struts2.spring.interceptor.SessionContextAutowiringInterceptor"/>
        </interceptors>
    </package>    
</struts>
2.0.6與之前版本整合的差異 之前的版本是這樣整合的
org.apache.struts2.dispatcher.Dispatcher
 private void init(ServletContext servletContext) {
  .......................
  if (Settings.isSet(StrutsConstants.STRUTS_OBJECTFACTORY)) {
   String className = (String) Settings.get(StrutsConstants.STRUTS_OBJECTFACTORY);
   if (className.equals("spring")) {
    className = "org.apache.struts2.spring.StrutsSpringObjectFactory";
   }
  }
  .......................
 }
很明顯的有硬來的嫌疑 2.0.6則是分為了幾個部份
org.apache.struts2.dispatcher.Dispatcher
 public void init() {
  init_DefaultProperties(); // [1]
  init_TraditionalXmlConfigurations(); // [2]
  init_LegacyStrutsProperties(); // [3]
  .......................
  init_AliasStandardObjects() ; // [4]
  .......................
 }
[1]載入了org/apache/struts2/default.properties [2]利用了StrutsXmlConfigurationProvider來載入struts-default.xml,struts-plugin.xml,struts.xml三個xml, 其中就包含了struts2-spring-plugin的struts-plugin.xml,這樣就能取得 <constant name="struts.objectFactory" value="spring" /> <bean ... name="spring" class="org.apache.struts2.spring.StrutsSpringObjectFactory" /> 這兩項設定 [3]載入struts.properties,透過手動設定的struts.objectFactory = spring, 就可以明白要載入的ObjectFactory Class是哪一個了 [4]此時才真正載入所有指定的Class 這樣做得確是較之前的方式好上不少,但是xml的設定檔就只能有這三個struts-default.xml,struts-plugin.xml,struts.xml 特別是struts-plugin.xml,如果自己還要寫Plugin或是希望同時能使用兩種不同的Plugin,都會遇到設定的問題.

沒有留言: