8

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

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

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 注释),因此正确的实现是什么?

4

2 回答 2

5

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

}
于 2018-03-05T08:31:56.107 回答
4

恐怕您必须为每个用例创建几个自定义注释,用@Transactional您需要的确切注释对每个用例进行注释。

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


更新:这是当时的正确答案,但从 Spring 4 起,应首选CLS 的答案

于 2010-08-31T09:45:41.387 回答