簡體   English   中英

啟用S​​pring AOP或AspectJ

[英]Enable Spring AOP or AspectJ

這是從這個問題繼續:

@Aspect方面的Spring autowired bean為null

我最初的理解是,當使用Spring AOP時,使用@Aspect注釋的類被創建為spring managed beans,因此依賴注入將正常工作。 但是,似乎帶有@Aspect注釋的對象被創建為spring容器外部的單例,因此我必須像XML一樣配置它,以便將其作為spring托管bean啟用:

<bean id="aspect" class="com.mysite.aspect" factory-method="aspectOf" />

這已經讓我完全糊塗了。 我認為以下配置將使用spring AOP:

<context:component-scan base-package="com.mysite.aspectPackage"/>
<aop:aspectj-autoproxy/>

因此,它將使用組件掃描創建方面bean來掃描@Aspect注釋,然后autoproxy將創建一個beanPostProcessor,它使用適當的建議代理我的上下文中的所有bean。 然后我想要啟用aspectJ我需要一個完全不同的XML配置(順便說一下,我似乎無法在文檔中找到一個例子)。 正是這種配置使用aspectJ來創建可以在我的容器之外的方面,或者通過操作字節碼而不是代理來工作。

注意
這不是關於spring AOP和J方面之間差異的問題,這里有很好的闡述:

Spring AOP vs AspectJ

@Aspect不是彈簧注釋,並且組件掃描不會檢測到它。 所以你必須以某種方式注冊它作為一個春天豆。 aspectOf解決方案有效。 你也可以試試

@Aspect
@Component

@Component將創建2個實例,一個在Spring容器內,一個在aspectJ容器內。

使用@Configurable允許spring在由aspectj容器實例化時為您的類管理依賴注入等。

@Aspect是一個由spring-aop支持的aspectj樣式注釋,其中運行時編織用於處理攔截等。

編譯時編織允許您忽略字節碼中將出現的切入點的使用,這是通過aspectj編譯器完成的(請參閱https://www.mojohaus.org/aspectj-maven-plugin/進行mvn集成)。

無論您使用aspectj編譯器還是spring-aop都沒有區別,除非您使用工廠/可配置,否則它不會以您希望的方式創建您的方面作為托管bean。

嚴格意義上,Aspectj配置是在您的類中存在的切入點定義等。

使用

  • @Aspect
  • @Configurable

還要在XML配置文件中添加“<context:spring-configured />”。

暫無
暫無

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

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