本文介紹了Spring AOP–如何使父上下文中定義的方面在子上下文中工作?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
在我的web.xml文件中:
<!-- Creates the Spring Container shared by all Servlets and Filters --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
上下文配置位置
類路徑:Shared-Conext.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文件中都放入該行。
有沒有辦法在父上下文中定義公共方面,并使它們在子上下文中工作?
推薦答案
Spring AOP代理的創建發生在通過Bean后處理器加載上下文的時候。由于只有在加載父上下文之后才加載子上下文,因此父上下文中定義的Bean后處理器不可能影響子上下文中的Bean。
如果希望代理子上下文中的Bean,則必須確保兩件事:
-
子上下文可以訪問方面Bean(將它們放在父上下文中是可以的)
上下文中包含執行代理本身的Bean后處理器
對于#2,您需要在每個子上下文定義中使用<aop:aspectj-autoproxy/>
。如果希望避免重復,請嘗試將所有子上下文共有的部分提取到單獨的XML文件中,然后可以將該文件導入到每個子上下文中。
這篇關于Spring AOP–如何使父上下文中定義的方面在子上下文中工作?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,