22

我正在使用 Aspect 在基于 spring mvc 的应用程序中记录活动。我正在使用@controller注释来定义我的应用程序中的任何控制器。我在两个不同的包中有两个不同的控制器说

  • com.package1 包含控制器 1 类,我们将其命名为 AController
  • com.package2 包含控制器 2 类,我们将其命名为 BController

我可以通过使用将方面应用于一个特定的控制器包

<aop:config>
    <aop:pointcut id="pointcut1"
        expression="execution(* package1.*.*(..))"
        id="policy1" />
    <aop:aspect ref="aspect1" order="1">
        <aop:before pointcut-ref="pointcut1" method="before" arg-names="joinPoint" />
        <aop:after-returning returning="returnValue" arg-names="joinPoint, returnValue" pointcut-ref="pointcut1" method="after"  />
    </aop:aspect>
</aop:config>


<bean id="aspect1" class="com......aspectclass" />

我的问题是如何在表达式(* package1. . . (..))**中指定多个不同的包。

现在,我为每个包声明一个单独的切入点,aop:beforeaop:after为每个切入点声明一个单独的入口。但我认为这应该是定义多个包切入点的理想方式。

4

4 回答 4

58

您可以使用布尔运算符:

expression="execution(* package1.*.*(..)) || execution(* package2.*.*(..))"
于 2011-12-08T07:46:34.953 回答
16

如果您使用注释

@Pointcut("within(com.package1..*) || within(com.package2..*)")
于 2015-12-17T08:57:19.853 回答
3

在春季启动

@Before("execution(* PackageName.Controller.Service.MethodName(..))          
  ||execution(* PackageName.Controller.Service.*.*(..))")

示例Spring-projects/AOP

于 2018-05-02T20:48:12.190 回答
1
  @Pointcut("execution(* pakageName.anyClassNameX.*(..)) || execution(* pakageName.anyClassNameY.*(..))")
  public void allMethods() {
  }

  @Around("allMethods()")
  public Object intercept(ProceedingJoinPoint thisJoinPoint) throws Throwable {
    try {
      return thisJoinPoint.proceed();
    } catch (Exception ex) {
     
    }
  }
于 2020-07-16T22:15:40.627 回答