如何扩展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 ApplicationContext 中启用“annotation-config”