2013-07-24 18 views
2

在我的web.xml文件中我有:Spring AOP - 如何使在父上下文中定義的方面在子上下文中工作?

<!-- Creates the Spring Container shared by all Servlets and Filters --> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

的contextConfigLocation 類路徑:共享的context.xml

<!-- Main general mapping, i.e. context for the UI & version queries --> 
<servlet> 
    <servlet-name>mainDispacherServlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
      <param-name>contextConfigLocation</param-name> 
      <param-value>classpath:web-application-context.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>mainDispacherServlet</servlet-name> 
    <url-pattern>/</url-pattern> 
</servlet-mapping> 

<!-- Processes application requests for version 1 --> 
<servlet> 
    <servlet-name>spring</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
       <param-name>contextConfigLocation</param-name> 
       <param-value>classpath:version-api-contexts/application-context[v1.0].xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>spring</servlet-name> 
    <url-pattern>/api/v1.0/*</url-pattern> 
</servlet-mapping> 

在父上下文,shared-context.xml,我有:

<aop:aspectj-autoproxy/> 

<context:component-scan base-package="com.company.cse.support.audit"/> 

包裝com.company.cse.support.audit包含一個標有@Component和 @Aspect的類。 此方面將消息記錄到我的審覈日誌。

當我在子上下文version-api-contexts/application-context[v1.0].xml中定義的bean上調用一個方法時,該bean不會被spring AOP代理,並且該方面不會被調用。 如果我將方面定義行<context:component-scan base-package="com.company.cse.support.audit"/> 移動到子上下文XML,該方面工作正常。

我最終會有很多子上下文,我不希望將這一行放在每個子XML文件中。 有沒有辦法在父上下文中定義共同的方面一次,並讓他們在子上下文中工作?

回答

6

創建Spring AOP代理髮生在通過bean後處理器進行上下文加載時。由於只有在加載父上下文後才加載子上下文,則在父上下文中定義的bean後處理器不可能影響子上下文中的bean。

如果你想在孩子上下文被代理豆,你必須確保兩兩件事:

  1. 孩子方面有機會獲得方面豆(讓他們在父上下文確定)
  2. 這個bean後處理器執行的代理本身包括在背景

#2你需要在每個孩子上下文定義<aop:aspectj-autoproxy/>。如果您想避免重複它,請嘗試將所有子上下文的通用部分分解爲單獨的xml文件,您可以依次導入其中的每個文件。

0

簡而言之,<aop:aspectj-autoproxy/>是一種豆後期處理器,豆後期處理器只能影響在相同上下文或其父上下文中加載的方面bean。

一個bean後處理器不可能影響子上下文中的bean(這些bean在父bean後處理器後初始化)。

相關問題