[英]How to make Spring with AspectJ weaver custom annotations
在我們的項目中,我們正試圖從Spring標准AOP遷移到AspectJ,正如在許多此類地方所解釋的那樣(我們需要使事務性成為一些私有和受保護的方法)。
我們已經能夠使用@Transactional
之類的標准Spring注釋使此工作正常進行。 但是我們面臨的問題是,在我們的項目中,存在一些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
的實現,以支持您自己的元數據源,在這種情況下,該接口的實現將處理@TransactionalWithCheckedException
批注(您的關注點將是TransactionAttribute.rollbackOn(Throwable ex)
方法) )。 然后,您可以將CompositeTransactionAttributeSource
用作TransactionAttributeSource
的實現,以便可以將支持Spring的@Transactional
注釋的元數據源與您的注釋組合在一起。
總結起來,您需要這兩件事來處理特殊的事務屬性:
AbstractTransactionAspect
的子類,有關實現思想,請參見AnnotationTransactionAspect
。 TransactionAttributeSource
實現。 使用CompositeTransactionAttributeSource
將對元數據的支持與spring的元數據( AnnotationTransactionAttributeSource
)結合在一起。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.