【问题标题】:Spring aop multiple pointcuts & advice but only the last one is workingSpring aop 多个切入点和建议,但只有最后一个有效
【发布时间】:2010-05-04 07:50:41
【问题描述】:

我创建了两个完全独立的 Spring AOP 切入点,它们将被编入系统的不同部分。切入点在两个不同的环绕通知中使用,这些环绕通知将指向同一个 Java 方法。

xml 文件的外观:

<aop:config>
    <aop:pointcut expression="execution(......)" id="pointcutOne" />
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" />

    <aop:aspect id="..." ref="springBean">
        <aop:around pointcut-ref="pointcutOne" method="commonMethod" />
        <aop:around pointcut-ref="pointcutTwo" method="commonMethod" />
    </aop:aspect>
</aop:config>

问题是只有最后一个切入点有效(如果我更改顺序 pointcutOne 有效,因为它是最后一个切入点)。我通过创建一个大切入点让它工作,但我想让它们分开。关于为什么一次只有一个切入点有效的任何建议?

【问题讨论】:

  • 我猜aop:aroung 只是问题中的一个错字。

标签: java spring aop


【解决方案1】:

尝试在&lt;aop:aspect&gt; 元素中添加切入点和建议。像这样的:

<aop:config>
  <aop:aspect id="aspect1" ref="springBean">
    <aop:pointcut expression="execution(......)" id="pointcutOne" />
    <aop:around pointcut-ref="pointcutOne" method="commonMethod" />
  </aop:aspect>

  <aop:aspect id="aspect2" ref="springBean">
    <aop:pointcut expression="execution(.....)" id="pointcurTwo" />
    <aop:around pointcut-ref="pointcutTwo" method="commonMethod" />
  </aop:aspect>
</aop:config>

我猜你的 XML 配置只产生了一个代理对象,而它应该是两个代理对象。


顺便说一句:您应该考虑改用@AspectJ 语法。它只是带有注解中的切入点和建议的 Java。它与 Spring AOP 配合得很好,并提供了比 XML 替代方案更多的功能。

您需要在配置中使用 Spring AOP 启用 @AspectJ 方面:

<aop:aspectj-autoproxy>
     <aop:include name="aspect1" />
     <aop:include name="aspect2" />
</aop:aspectj-autoproxy>

<bean id="aspect1" class="com.demo.Aspect1"/>
<bean id="aspect2" class="com.demo.Aspect2"/>

Aspect 可能是这样的:

@Aspect
public class Aspect1 {

    @Pointcut("execution(* *(..))")
    public void demoPointcut() {}

    @Around("demoPointcut()")
    public void demoAdvice(JoinPoint joinPoint) {}
}

更新:

使用切入点组合其他三个切入点的示例:

@Pointcut("traceMethodsInDemoPackage() && notInTestClass() " +
    "&& notSetMethodsInTraceDemoPackage()")
public void filteredTraceMethodsInDemoPackage() {}

【讨论】:

  • 同样的问题,这很奇怪。当我只有一个切入点时它确实工作得很好,但它很快变得非常大。感谢您提供有关使用注释的建议。我完全同意你的看法,这是比使用 xml 更好的解决方案。除了 xml,我确实有类似的切入点作为注解,但我也想支持 xml,因为它可以让主项目在不重新编译的情况下更改方面。
  • 这很奇怪。代理对象应该在您的连接点建议的方法之前和之后递归调用。如果它与一个切入点一起使用,您可以创建第三个切入点,将前两个切入点结合起来,并在环绕建议中使用它。
  • 使用注释效果很好,所以我认为我至少会更新大部分方面以使用它而不是 xml。只需要注意我们需要重新编译才能进行更改。感谢您的帮助!
  • 我只是想知道假设您有两个“环绕”建议,但切入点不同。如果您的功能之一满足两个切入点怎么办。那时会发生什么。该函数是否会运行两次,因为您的两个建议都包含“point.proceed()”。有人可以对此有所了解吗?
  • 我看到只有一个包含在 元素中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多