如何扩展Spring Annotation @Transactional

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何扩展Spring Annotation @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注释),这是什么正确的实现?

答案

你将不得不创建几个自定义注释,我担心,每个用例都有一个,用你需要的精确@Transactional注释注释每个注释。

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

另一答案

在春季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;

}

以上是关于如何扩展Spring Annotation @Transactional的主要内容,如果未能解决你的问题,请参考以下文章

Spring - @PostConstruct 源码解析

Spring - @PostConstruct 源码解析

Spring系列基于Annotation(注解)的装配应用

如何以编程方式在 Spring ApplicationContext 中启用“annotation-config”

如何使用@Value Spring Annotation 注入 Map?

如果 POJO 扩展了 Spring Jackson 中的抽象类,如何忽略它的大小写?