2010-11-30 50 views
4

概述
使用衝突Spring註解與我的設計指導

  • 春3.0.1(註釋配置)
    • 當前配置使用CGLIB作爲代理的創造者,但是這不是我的偏好
    • 交易註釋配置沒有任何特殊設置
    • 所有配置都使用註釋完成(@Service@Transactional@ManagedResource@Inject等)
  • 的Hibernate 3.5(實體與javax.persistence註釋)

準則凸顯

  • 每豆與@Repository@Service必須的註解有一個接口
  • 構造器DI(當不需要重新配置時)
    • 構造具有默認能見度(Foo(Bar bar) {...}
  • 豆字段最終(不需要重新配置時)
    • 沒有導致默認構造函數
  • 實施方案爲默認可見最終修飾符(final class Foo

的問題

  1. CGLIB不能代理final類
  2. CGLIB需要默認的空構造
  3. 需要一些服務通過JMX暴露
  4. MBean出口商不能工作,除非由CGLib代理
  5. 一些@Transactional@Service s是通過門面服務訪問的,這需要一個以上的服務包含在門面事務中(例如,觀察家服務超過2應用程序組件)
  6. 某些接口有一個以上的實施(目前由@Qualifier區別)
  7. 未來的指導方針(或不錯的功能) - 每個應用程序模塊將有beanRefContext.xml文件來配置它的內部應用程序上下文

當我過去使用XML配置工作時,我能夠強制執行上面提到的所有準則,但切換到註釋時看起來像Spring是行爲不當的。
我的組中的開發人員更喜歡註釋配置(我似乎更容易連線和編寫新代碼),但我注意到他們向代碼中引入了各種「黑客」,以防止處理Spring應用程序上下文故障。

的問題(一個或多個)

  1. 是否有使用註釋配置時,我應該遵循最佳實踐?
    • 當使用每個接口多於一個實現(試圖減少使用@Primary@Qualifier)當使用@ManagedResource
    • 當使用上述
  2. 的組合
  3. 當使用@Transactional
  4. 有沒有辦法停止使用CGLib,保持註釋配置,仍然能夠導出我的MBeans註釋?
  5. 保留大部分(最好是全部)我的指導方針的適當實施是什麼?
+1

恕我直言,這些指導方針很奇怪。爲什麼不嘗試遵守Java Beans規範?而且無論如何,如果他們只是指導方針,我想你可以忽略那些如果結束是合理的,那麼中間的那些。 – gpeche 2010-11-30 19:30:48

+1

我不會稱他們爲陌生人,他們是從有效的Java編程指南繼承而來的。這些不是Java bean,而是Spring beans。另外,使用XML時,遵循這些準則並沒有問題,所以恕我直言註釋是不合理的。 – Bivas 2010-11-30 19:40:38

回答

3

我想出了以下解決方案(以問題#2,#3),以能夠執行我的設計準則,繼續使用基於註解的配置:

  • 每個相關項目(Maven的模塊)有它的自己ApplicationContext
  • 每個項目相關的應用程序上下文中beanRefContext.xml
  • 的定義,這些應用程序上下文中使用Spring上下文結構機制的層次結構加載。
    • 這一步實際上是不完全支持Spring和需要額外work
  • 由於我的應用程序是分層的,我可以在除了JMX層(我可以住在一起我所有模塊禁用CGLIB: - ))。

上述步驟還使我減少了Spring認知測試的執行時間(每個模塊只加載一個子集)。如果一個接口有多個實現,我將@Primary放在廣泛使用的客戶端上,需要另一個實現,使用@Qualifier連接這個bean。如果接口有多個實現,我將@Primary放在廣泛使用的客戶端上,需要另一個實現。

1

回答點2) 您可以使用AspectJ代替CGLib。