在我们的项目中,我们试图从Spring标准AOP转移到AspectJ,如this等许多地方所解释的那样(我们需要使用事务处理一些私有和受保护的方法)。
我们已经能够使用@Transactional
之类的标准Spring注释使这项工作正常。但是我们面临的问题是,在我们的项目中,有一些自定义注释(不是自定义方面),AspectJ无法识别。例如,我们有一个“扩展”@Transactional
的注释(仅修改rollbackFor
属性):
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
@Transactional(rollbackFor = Exception.class)
public @interface TransactionalWithCheckedException {
}
关于如何告诉AspectJ织布这个自定义注释的任何想法?可能吗?如果没有,我应该构建自定义的Aspects扩展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 />
答案 0 :(得分:1)
嗯,首先,Spring @Transactional
注释不是元注释,因此它不能用于注释类型。此外,spring事务代码中的任何内容都不支持这种用法。为了支持这种用法,您必须使用正确的切入点创建一个专门的方面来识别事务边界处的连接点,可能支持原始的Spring @Transactional
注释和您的自定义注释。好。您还需要为方面提供TransactionAttributeSource
的实现,以支持您自己的元数据源,在您的情况下,该接口的实现处理@TransactionalWithCheckedException
注释(您的兴趣点将是TransactionAttribute.rollbackOn(Throwable ex)
方法)。然后,您可以使用CompositeTransactionAttributeSource
作为TransactionAttributeSource
的实现,以便您可以合并支持Spring @Transactional
注释的元数据源以及您的注释。
总结一下,你需要这两件事来处理特殊的交易属性:
AbstractTransactionAspect
的子类,请参阅AnnotationTransactionAspect
了解实现方法。TransactionAttributeSource
实施。使用CompositeTransactionAttributeSource
将对元数据的支持与spring的元数据(AnnotationTransactionAttributeSource
)结合起来。