2010-08-31 38 views
6

我必須在我的webapp中使用3個不同的事務管理器。所以我根據Spring reference(10.5.6.3自定義快捷方式註釋)編寫了自己的註釋。如何擴展Spring註解@Transactional

一個註解(使用一個特定的事務管理器)是這樣的:使用自定義@CustomerTX註解註釋我的服務層時

import java.lang.annotation.ElementType; 
import java.lang.annotation.Retention; 
import java.lang.annotation.RetentionPolicy; 
import java.lang.annotation.Target; 

import org.springframework.transaction.annotation.Transactional; 

@Target({ElementType.METHOD, ElementType.TYPE}) 
@Retention(RetentionPolicy.RUNTIME) 
@Transactional("customer") 
public @interface CustomerTX{ 


} 

一切工作正常。但是我必須爲我的註釋提供更多選項,如readonly = true,rollbackFor =等等。因爲你不能「擴展」一個註釋(我真的只需要從Spring擴展@Transactional註解),那麼這個正確的實現是什麼?

回答

3

您將不得不爲每個用例創建幾個自定義註釋,每個註釋都註明您需要的確切@Transactional註釋。

或者您將不得不在AspectJ中編寫自己的方面(從spring-aspects.jar擴展org.springframework.transaction.aspectj.AbstractTransactionAspect)來創建您自己的事務邏輯。

+0

你真的是我必須寫這樣的事情(假設我只是想有設置爲只讀交易): @Target({ElementType.METHOD,ElementType.TYPE}) @Retention( RetentionPolicy.RUNTIME) @Transactional(值= 「客戶」,只讀= TRUE) 公共@interface CustomerTXReadonly { } 這不可能是唯一的工作解決... – 2010-08-31 10:58:55

+0

恐怕是這樣,因爲註釋的侷限性。正如我所說:無論是或寫你自己的方面(我寧願) – 2010-08-31 11:01:00

+0

感謝您的幫助。我會嘗試寫我自己的方面。可惜的是註釋不可擴展:( – 2010-08-31 14:35:55

0

在春季4你可以做到這一點。如documentation

中所述,也可以組合元標註來創建組合註釋。例如,Spring MVC的@RestController註釋由@Controller和@ResponseBody組成。

此外,組合註釋可以選擇性地重新聲明來自元註釋的屬性以允許用戶定製。當您只想暴露元註釋屬性的子集時,這可能特別有用。例如,Spring的@SessionScope註解將範圍名稱硬編碼爲會話,但仍允許定製proxyMode。

@Target({ElementType.TYPE, ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
@Documented 
@Scope(WebApplicationContext.SCOPE_SESSION) 
public @interface SessionScope { 

    /** 
    * Alias for {@link Scope#proxyMode}. 
    * <p>Defaults to {@link ScopedProxyMode#TARGET_CLASS}. 
    */ 
    @AliasFor(annotation = Scope.class) 
    ScopedProxyMode proxyMode() default ScopedProxyMode.TARGET_CLASS; 

}