Upgrade to Spring 2.0

03:42上午 十月 09, 2006 in category Java by ingramchen

Original System Configuration:

  • Spring 1.2.8
  • Hibernate 3.0.5

Upgrade to:

  • Spring 2.0
  • Hibernate 3.2.0rc4

Lists:

  1. 改變 xml 的 dtd 到 xsd,原來: 成: 上面包括 beans/util/aop/tx 等重要的 xsd,其他還有 jee/lang/tool 等不常用的,詳情請見 xsd-config
  2. singleton="true" 要改為 scope="singleton",singleton="false" 要改為 scope="prototype"
  3. <util:foo> 很好用,例如: 可改為
  4. jdbcTemplate 的 ResultReader 已經正式拿掉了。原本: 改寫為:
  5. Hibernate3 的 count 回傳原本是 Integer,新版變成回傳 Long (改這個真的是太狠了...)
  6. 承上,在 hql 直接 new 也受影響:
  7. Hibernate3 的 UserType 原本在 HQL 只能用 string/int... 代入,現在可直接用 原來的 type:
  8. Hibernate3 interceptor 加了四個 method: onCollectionRecreate()/onCollectionUpdate()/onCollectionRemove()/onPrepareStatement() 。跟其他 method 不一樣的是,String onPrepareStatement(String statement) 預設最少要回傳 argument statement,而不是 null
  9. spring.jar 不再內建 hibernate2 相關的 class,舊系統需要的話要加入 spring-hibernate2.jar
  10. Hibernate3 預設不再偵測 ehcache,需手動設定
  11. 測試用的 MockServletContext 改變尋找路徑的方法。原本測試時我們可以這樣做假的 webApplicationContext 升級後發現 MockServletContext 內部會改(先?) 用 filesystem 的方式去找檔案,當然就掛了... 解決的方法是強制要它走 classpath: 光這個就搞了我兩個小時... 暈倒...
  12. MockHttpSesseion 做 setAttribute/removeAttribute 時,現在會 trigger event 給 HttpSessionBindingListener 了 (越來越像真的...快不能叫 Mock 囉)

感覺升級 hibernate 問題比較多 =_=;。至於那個 aop 新的 transaction 的寫法... 呃,我還是覺得 txProxyTemplate 的寫法比較好... aspectj 的方式對 package/class 名稱的限制太多了 (因為要讓 pointcut wildcard "寫的出來"...)。改天拿便當系統來亂改試試,呵

最後,令人失望的是 Spring 2 沒有像 EJB3 那樣直接寫個 @Stateless 就可以定義一個 bean,還是得在 xml 寫一個 <bean>... 真希望能夠在 class 上加個 @Bean(id="fooService") 就 ok 了。很多 bean 都很簡單,不需要什麼設定,很適合這種寫法說。 Spring 就是死也不走侵略式的做法。可我不 care 被 Spring 侵略啊!下次自己寫一個算了 =_=

[Update] 加兩條和測試有關的。

迴響[2]

迴響:

我也是利用這個長假升級到 spring 2.0 (hibernate 3.0 之前已經痛過了), 因為想用新的 aop tx, 惡夢就來啦~~
用 unit test 怎麼跑都正確, 可是換到 ap server 上跑 aspectj 就一定失靈..:S
這裡換換那裡換換也都沒用, 最後只好換回 txProxyTemplate 舊招, 浪費我ㄧ整天..
其他就大致上順利, 因為相容性很好..

由...發表 tempo on 十月 11, 2006 at 05:29 下午 CST #

喔喔,tempo 已經衝上去用 aop tx 了,沒想到這麼難搞... 我才剛想試而己說...
我在 reference 看到範例的 point cut 都很好寫,都是像

execution(* com.foo..service.*.*(..))

這樣,直接用 package 來分就可以。不過我一直認為這是 bad practice
(應該要按 domain 分 package,而不是按架構分)。
結果之前的 code 都是按 domain 的分法,pointcut 反而寫不出來 =_=

繼續 try...

由...發表 ingramchen on 十月 11, 2006 at 06:21 下午 CST #

發表迴響:
  • HTML 語法: 關閉