我必须在我的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注释),为什么这是正确的实现?
答案 0 :(得分:3)
您将不得不创建多个自定义注释,我担心,每个用例都有一个注释,并使用您需要的完整@Transactional
注释对每个注释进行注释。
或者您必须在AspectJ中编写自己的方面(从spring-aspects.jar扩展org.springframework.transaction.aspectj.AbstractTransactionAspect
)以创建自己的事务逻辑。
答案 1 :(得分:1)
在春季4你可以做到这一点。如documentation
中所述也可以组合元注释来创建组合注释。例如,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;
}