如何扩展Spring注解@Transactional

10
我必须在我的Web应用程序中使用3个不同的事务管理器。因此,我根据Spring参考文档(第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个回答

6

在Spring 4中,您可以这样做。正如文档中所述。

元注释也可以组合成复合注释。例如,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;

}

4
您需要创建几个自定义注释,每个用例都需要一个,使用确切的@Transactional注释进行注释。
或者,您需要在AspectJ中编写自己的方面(从spring-aspects.jar扩展org.springframework.transaction.aspectj.AbstractTransactionAspect),以创建自己的事务逻辑。

更新:这是正确答案的时候,但是从Spring 4开始,C.L.S的答案应该被优先考虑。


你是说我必须写这样的代码吗?(假设我只想将事务设置为只读):@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Transactional(value="customer",readOnly=true) public @interface CustomerTXReadonly{}这不可能是唯一可行的解决方案... - tim.kaufner
我很抱歉,因为注释的限制,只能这样做。正如我所说:要么这样做,要么编写自己的方面(我更喜欢这种方式)。 - Sean Patrick Floyd
谢谢你的帮助。我会尝试编写自己的方面。很遗憾注释不能扩展 :( - tim.kaufner
请注意,自几年前(Spring 4)以来,另一个答案 https://dev59.com/zlDTa4cB1Zd3GeqPGyYb#49106255 是正确且更简单的方法。 - jhyot
@jhyot 确认。我在我的回答中添加了一条注释。 - Sean Patrick Floyd
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接