gpt4 book ai didi

java - Spring AOP - 如何使父上下文中定义的方面在子上下文中工作?

转载 作者:行者123 更新时间:2023-12-05 09:23:58 24 4
gpt4 key购买 nike

在我的 web.xml 文件中我有:

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

contextConfigLocation classpath: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 和@方面。这方面会在我的审计日志中记录一条消息。

当我在子上下文中定义的 bean 上调用方法时 version-api-contexts/application-context[v1.0].xml bean 没有被 spring AOP 代理,并且方面没有被调用。如果我移动方面定义行 <context:component-scan base-package="com.company.cse.support.audit"/> 对于子上下文 XML,该方面工作正常。

我最终会有很多子上下文,我不想将这一行放在每个子 XML 文件中。有没有一种方法可以在父上下文中定义一次公共(public)方面并让它们在子上下文中工作?

最佳答案

Spring AOP 代理的创建发生在通过 bean 后处理器加载上下文时。由于只有在父上下文已经加载后才会加载子上下文,因此在父上下文中定义的 bean 后处理器不可能影响子上下文中的 bean。

如果您希望子上下文中的 bean 被代理,您必须确保两件事:

  1. 子上下文可以访问方面 bean(将它们放在父上下文中是可以的)
  2. 执行代理本身的 bean 后处理器包含在上下文中

对于#2,您需要<aop:aspectj-autoproxy/>在每个子上下文定义中。如果您想避免重复,请尝试将所有子上下文共有的部分提取到一个单独的 xml 文件中,您可以依次将其导入到每个子上下文中。

关于java - Spring AOP - 如何使父上下文中定义的方面在子上下文中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17836041/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com