本文介紹了Spring AOP–如何使父上下文中定義的方面在子上下文中工作?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧!
問題描述
在我的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
包含一個(gè)標(biāo)記為@Component的類,并且
@Aspect。
此方面會(huì)在我的審核日志中記錄一條消息。
當(dāng)我調(diào)用子上下文version-api-contexts/application-context[v1.0].xml
中定義的Bean上的方法時(shí),該Bean不會(huì)被Spring AOP代理,方面也不會(huì)被調(diào)用。
如果我移動(dòng)特征定義行<context:component-scan base-package="com.company.cse.support.audit"/>
對(duì)子上下文XML來(lái)說(shuō),方面工作得很好。
我最終將擁有許多子上下文,我不希望在每個(gè)子XML文件中都放入該行。
有沒有辦法在父上下文中定義公共方面,并使它們?cè)谧由舷挛闹泄ぷ鳎?/p>
推薦答案
Spring AOP代理的創(chuàng)建發(fā)生在通過(guò)Bean后處理器加載上下文的時(shí)候。由于只有在加載父上下文之后才加載子上下文,因此父上下文中定義的Bean后處理器不可能影響子上下文中的Bean。
如果希望代理子上下文中的Bean,則必須確保兩件事:
-
子上下文可以訪問方面Bean(將它們放在父上下文中是可以的)
上下文中包含執(zhí)行代理本身的Bean后處理器
對(duì)于#2,您需要在每個(gè)子上下文定義中使用<aop:aspectj-autoproxy/>
。如果希望避免重復(fù),請(qǐng)嘗試將所有子上下文共有的部分提取到單獨(dú)的XML文件中,然后可以將該文件導(dǎo)入到每個(gè)子上下文中。
這篇關(guān)于Spring AOP–如何使父上下文中定義的方面在子上下文中工作?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,