Spring AOP 切入点表达式中包名称的通配符支持

Wildcard support on package name in Spring AOP pointcut expression

我正在尝试实现一个记录器方面,它可以应用于我的应用程序中的多个包。它是一个大型 spring Web 应用程序,具有许多模块。每个模块都有自己的控制器、服务和 DAO。我定义的切入点针对包内每个 类 上的所有 public 方法。控制器为 public * com.abc.module1.controllers.*.*(..),服务为 public * com.abc.module1.services.*.*(..),模块 1 中的 DAO 为 public * com.abc.module1.daos.*.*(..)。我有大约 30 个这样的模块。所以问题是,为了涵盖所有这些模块,我必须为每个模块定义切入点。所有模块都遵循相同的包结构。有没有一种方法可以指定可以覆盖放置在不同模块中的所有 controllersservices 的切入点? spring AOP 是否允许在包名中使用通配符?

我建议阅读 AspectJ documentation,例如

那你就不用在这里问这样的问题了

无论如何,这是您解决问题的方法(我添加换行符以提高可读性):

execution(public * com.abc..controllers..*(..)) ||
execution(public * com.abc..services..*(..)) ||
execution(public * com.abc..daos..*(..))

或者:

(
  within(com.abc..controllers..*) ||
  within(com.abc..services..*) ||
  within(com.abc..daos..*)
) &&
execution(public * *(..))

如果你使用 Spring AOP 而不是成熟的 AspectJ 你可以使它更简单,因为 Spring AOP 基本上只知道 execution() 而没有像 [=14= 这样的其他切入点], 构造函数执行, set() / get()

within(com.abc..controllers..*) ||
within(com.abc..services..*) ||
within(com.abc..daos..*)

使用 JDK 动态代理(组件实现接口时的默认设置)无论如何这只会针对 public 方法调用。使用 CGLIB 代理,它还将针对受保护和包私有的代理。顺便说一句,如果您以后从 Spring AOP 迁移到 AspectJ,您还需要将您的简单切入点升级到上述更明确的切入点之一。