如何扩展Spring Annotation @Transactional

问题描述 投票:6回答:2

我必须在我的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注释),这是什么正确的实现?

java spring annotations transactional
2个回答
3
投票

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

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


1
投票

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

}
© www.soinside.com 2019 - 2024. All rights reserved.