gpt4 book ai didi

java - 如何使用 AspectJ weaver 自定义 Spring 注解

转载 作者:行者123 更新时间:2023-12-01 10:45:46 25 4
gpt4 key购买 nike

在我们的项目中,我们正在尝试从 Spring 标准 AOP 迁移到 AspectJ,正如 this 等许多地方所解释的那样。 (我们需要使一些私有(private)和 protected 方法具有事务性)。

我们已经能够使用标准 Spring 注释(例如 @Transactional)来使这项工作正常进行。但是我们面临的问题是,在我们的项目中,有一些 AspectJ 无法识别的自定义注释(不是自定义方面)。例如,我们有一个“扩展”@Transactional 的注释(仅修改 rollbackFor 属性):

@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Transactional(rollbackFor = Exception.class)
public @interface TransactionalWithCheckedException {

}

关于如何告诉 AspectJ 编织这个自定义注释有什么想法吗?是否可以?如果没有,我应该构建扩展 Spring 方面的自定义方面(即:用于 @Transactional)。

有关更多信息,请参阅 aop.xml:

<aspectj>
<aspects>
<!-- Aparently no need to explicit declare aspects like the ones used by Spring @Transactional or @Async, they work fine. -->
</aspects>
<weaver options="-XnoInline -Xreweavable -showWeaveInfo">
<include within="com.mycompany.myproject..*" />
</weaver>

以及 Spring 上下文配置文件的一部分:

 <tx:annotation-driven mode="aspectj" />
<context:load-time-weaver />

最佳答案

首先,Spring @Transactional 注解不是元注解,因此它不能用于注解类型。此外,Spring 事务代码中没有任何内容支持这种用法。为了支持这种用法,您必须创建一个具有适当切入点的专门方面来识别事务边界处的连接点,可能同时支持原始 Spring @Transactional 注释和您的自定义注释也是如此。您还需要为方面提供 TransactionAttributeSource 的实现,以支持您自己的元数据源,在您的情况下,该接口(interface)处理 @TransactionalWithCheckedException 注释的实现(您的感兴趣的点是 TransactionAttribute.rollbackOn(Throwable ex) 方法)。然后,您可以使用 CompositeTransactionAttributeSource 作为 TransactionAttributeSource 的实现,这样您就可以将支持 Spring 的 @Transactional 注释的元数据源与您的注释结合起来。

总而言之,您需要这两个东西来处理特殊的事务属性:

  • 支持您和 Spring 注释的具体 Aspect(可能是 AbstractTransactionAspect 的子类,请参阅 AnnotationTransactionAspect 了解实现思路`
  • 处理事务注释的 TransactionAttributeSource 实现。使用CompositeTransactionAttributeSource将对您的元数据的支持与Spring的元数据(AnnotationTransactionAttributeSource)结合起来。

关于java - 如何使用 AspectJ weaver 自定义 Spring 注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34182324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com