簡體   English   中英

如何使用AspectJ Weaver自定義注釋制作Spring

[英]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注釋的元數據源與您的注釋組合在一起。

總結起來,您需要這兩件事來處理特殊的事務屬性:

  • 同時支持您和Spring注釋的具體方面(可能是AbstractTransactionAspect的子類,有關實現思想,請參見AnnotationTransactionAspect
  • 處理您的交易注釋的TransactionAttributeSource實現。 使用CompositeTransactionAttributeSource將對元數據的支持與spring的元數據( AnnotationTransactionAttributeSource )結合在一起。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM