2012-03-12 146 views
6

這是從這個問題下面就:啓用的Spring AOP還是AspectJ

Spring autowired bean for @Aspect aspect is null

我最初的理解是,在使用Spring AOP的時候,用@Aspect註解的類創建爲春季管理的bean,所以依賴注入會正常工作。然而,它似乎與@Aspect註解的對象作爲Spring容器外的單創建的,因此我不得不配置它在XML像這樣以使其彈簧託管bean:

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

這現在已經完全困惑了我。我想下面的配置將使用Spring AOP的:

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

因此,這將使用組件掃描創建方面豆類掃描@Aspect註解,然後自動代理將創建了BeanPostProcessor其代理我的上下文中的所有豆類與適當的諮詢。然後我想啓用aspectJ我需要一個完全不同的XML配置(順便說一句,我似乎無法在文檔中找到示例)。這種配置使用aspectJ來創建將在我的容器之外或者通過操作字節碼而不是代理來工作的方面。


這不是Spring AOP和方面Ĵ之間的差異問題,這是很好這裏闡述:

Spring AOP vs AspectJ

回答

5

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

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

@Aspect是由彈簧AOP,在運行時編織是用來處理支持一個AspectJ風格的註解攔截等

編譯時編織讓你忽略使用爲切入點將出現在字節碼,這是通過aspectj編譯器完成的(關於mvn集成,請參閱http://mojo.codehaus.org/aspectj-maven-plugin/)。

無論你使用aspectj編譯器還是spring-aop沒有區別,它都不會以你想要的方式創建你的方面作爲託管bean,除非你使用工廠/可配置。

Aspectj配置嚴格來說是切入點定義等,它們將存在於你的類中。

+0

我在spring 4.3中試過這個,並且用@ @Aspect' @ Component'註解方面,即使使用DI,它也可以很好地工作,就像@Bozho在他的回答中所寫的一樣 – csharpfolk 2016-11-27 17:45:53

8

@Aspect不是春註釋,這是不通過組件掃描檢測。所以你必須以某種方式將它註冊爲一個spring bean。 aspectOf解決方案有效。你也可以嘗試

@Aspect 
@Component 
+0

那麼aspectJ配置和彈簧AOP配置有什麼區別? – mogronalol 2012-03-12 14:12:38

+1

做這項工作?我發現如果我這樣做,這個春天會創建該類的兩個實例,並且用作該方面的那個實例不會注入其依賴項。 – 2012-04-17 08:57:45

-1

使用

  • @Aspect
  • @Configurable

同時添加 「<方面:彈簧配置/>」 在您的XML配置文件。