2

私の web.xml ファイルには次のものがあります。

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

contextConfigLocation クラスパス:shared-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 でマークされたクラスが含まれています。この側面は、私の監査ログにメッセージを記録します。

子コンテキストで定義された Bean でメソッドを呼び出すと、version-api-contexts/application-context[v1.0].xmlBean は Spring AOP によってプロキシされず、アスペクトは呼び出されません。アスペクト定義行<context:component-scan base-package="com.company.cse.support.audit"/> を子コンテキスト XML に移動すると、アスペクトは正常に機能します。

最終的には多くの子コンテキストを持つことになるため、子 XML ファイルのそれぞれにこの行を入れる必要はありません。親コンテキストで一度共通の側面を定義し、それらを子コンテキストで機能させる方法はありますか?

4

2 に答える 2

8

Spring AOP プロキシの作成は、Bean ポストプロセッサを介したコンテキストのロード時に行われます。子コンテキストは、親コンテキストが既にロードされた後にのみロードされるため、親コンテキストで定義された Bean ポストプロセッサーは、子コンテキストの Bean に影響を与える可能性はありません。

子コンテキストの Bean をプロキシする場合は、次の 2 つのことを確認する必要があります。

  1. 子コンテキストは、アスペクト Bean にアクセスできます (親コンテキストでそれらを持つことは問題ありません)。
  2. プロキシ自体を実行する bean ポスト プロセッサは、コンテキストに含まれます。

<aop:aspectj-autoproxy/>#2については、各子コンテキスト定義で必要になります。繰り返しを避けたい場合は、すべての子コンテキストに共通する部分を個別の xml ファイルに分割して、それぞれにインポートできるようにしてください。

于 2013-07-24T14:48:11.720 に答える