如何扩展Spring Annotation @Transactional

时间:2010-08-31 09:39:13

标签: java spring annotations transactional

我必须在我的webapp中使用3个不同的事务管理器。所以我根据Spring reference(第10.5.6.3节自定义快捷方式注释)编写了自己的注释。

一个注释(用于使用一个特定的事务管理器)如下所示:

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{


}

使用自定义的@CustomerTX注释注释我的服务图层时,一切正常。但是我必须为我的注释提供更多选项,比如readonly = true,rollbackFor =等等。因为你不能“扩展”一个注释(我真的只需要从Spring扩展@Transactional注释),为什么这是正确的实现?

2 个答案:

答案 0 :(得分:3)

您将不得不创建多个自定义注释,我担心,每个用例都有一个注释,并使用您需要的完整@Transactional注释对每个注释进行注释。

或者您必须在AspectJ中编写自己的方面(从spring-aspects.jar扩展org.springframework.transaction.aspectj.AbstractTransactionAspect)以创建自己的事务逻辑。

答案 1 :(得分:1)

在春季4你可以做到这一点。如documentation

中所述

也可以组合元注释来创建组合注释。例如,Spring MVC的@RestController注释由@Controller和@ResponseBody组成。

此外,组合注释可以选择从元注释重新声明属性以允许用户自定义。当您只想公开元注释属性的子集时,这可能特别有用。例如,Spring的@SessionScope注释将范围名称硬编码为session,但仍允许自定义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;

}