簡體   English   中英

與Spring中的AOP配置有關的一些疑問

[英]Some doubts related to the AOP configuration in Spring

我正在學習Spring Core認證,並且對Spring如何處理AOP有疑問。

閱讀文檔似乎可以理解存在兩種獲取Java AOP的方法:

  1. 使用AspectJ時 ,使用字節碼修改進行方面編織可提供一種成熟的面向方面的編程語言。 (因此在我看來, AspectJ是一種可以與Java集成以提供AOP功能的不同語言)。

  2. Spring AOP :在Spring框架中使用,該框架使用動態代理進行方面編織,而不是字節碼修改。

所以我的懷疑主要是以下幾點:

1)閱讀文檔發現以下方法可以將AOP支持添加到我的Spring應用程序:

使用JAVA配置類:

@Configuration
@EnableAspectJAutoProxy
@ComponentScan(basePackages=“com.example”)
public class AspectConfig {
    ...
}

使用XML配置:

<beans>
    <aop:aspectj-autoproxy />
    <context:component-scan base-package=“com.example” />
</beans>

正如您在兩種配置中看到的那樣,都有對AspectJ的引用:

@EnableAspectJAutoProxy

<aop:aspectj-autoproxy />

為什么? 如果Spring使用Spring AOP代替AspectJ,為什么在Spring中配置AOP時會引用AspectJ

2)在前面的示例中,顯示了配置Spring的2種方法:通過Java配置類和通過XML配置 我知道存在配置Spring應用程序的第三種方法:通過使用批注 因此, 存在使用批注配置AOP的方法嗎?

我認為這些Spring AOP設置中名稱中涉及到AspectJ的內容確實令人煩惱,沒有幫助。 我能理解你為什么感到困惑。 Spring AOP實際上是與AspectJ不同的概念。 如您所說:在AspectJ的編譯或加載期間,Spring AOP中的動態JDK或CGLIB代理與字節代碼檢測相對。 其他區別是:

  • AspectJ的編譯時編織需要一個稱為Ajc的特殊編譯器。 它基本上是由執行檢測的方面weaver增強的Eclipse Java編譯器Ecj 相反,Spring AOP在運行時創建動態代理。
  • 在AspectJ中,有兩種語法變體:本機和基於注釋。 前者更優雅,更富有表現力,是Java的超集,肯定需要Ajc進行編譯。 后者使用Java批注,並且可以使用Javac進行編譯, 但是需要同時包含在Ajc (編譯時)和編織代理Aspectjweaver.jar (加載時)中的Aspect Weaver,以“完成”它們並使它們在運行時可用。 這兩個變體都需要AspectJrt.jar (很小,在運行時用於編譯時編織方面)和Aspectjweaver.jar (更大,用於加載時編織,既包含運行時又包含Weaver )中包含的AspectJ運行時。 。
  • AspectJ適用於任何Java類,它不需要甚至不了解Spring框架。 Spring AOP需要以Spring框架為基礎,您只能使用它來檢測Spring Beans / Components,而不能使用與Spring無關的POJO。
  • AspectJ效率更高,因為它避免了代理。 但是無論如何,Spring AOP仍然是Spring框架的可選部分,因此,如果您使用Spring並且只需要執行Spring Bean的方法執行攔截,那么使用它就很有意義了。
  • Spring AOP使用AspectJ切入點語法的子集。 也許這是Spring AOP使用AspectJ引用的微妙原因,但是我仍然認為,就術語而言,不更清晰地區分這兩個概念是一個錯誤的決定。 此外,公共poinctut語言子集在一個名為aopalliance.jar的小JAR中定義,因為很久以前,所謂的“ AOP Alliance”已經定義了該語法。 但是,當今最主要和迄今為止最強大的AOP語言是AspectJ,因此實際上AspectJ(由Eclipse維護)是該領域的領導者IMO。
  • 當我說Spring AOP使用AspectJ語法的子集時,相反地,這意味着AspectJ提供了一個超集。 還有更多的切入點類型,例如call()set()get()等,您還有更多選擇,可以通過建議或內部類型定義來攔截連接點並將跨切面的關注點應用於代碼庫。

我不明白您的問題2。 您的示例中的配置類確實使用了注釋,因此沒有第三種方法。 ;-)但是在Spring中有一種古老的,確實過時的AOP方法,稱為攔截器。 盡管它仍然可以使用,但它是早期AOP方法的遺留物,如今已​​經過時了。

Spring AOP和AspectJ都可以通過XML或Spring中的注釋進行配置。 :-)

不知道我是否完全理解您的問題,我想您是在問:“如果使用Spring AOP,為什么會看到對AspectJ的引用?”

如果是這樣,您應該知道Spring不會與AspectJ 競爭 ,而是可以 AspectJ用於AOP。

請參閱Spring文檔: http : //docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/aop.html

暫無
暫無

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

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