2010-08-31 39 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; 

}