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 个这样的模块。所以问题是,为了涵盖所有这些模块,我必须为每个模块定义切入点。所有模块都遵循相同的包结构。有没有一种方法可以指定可以覆盖放置在不同模块中的所有 controllers
、services
的切入点? 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,您还需要将您的简单切入点升级到上述更明确的切入点之一。
我正在尝试实现一个记录器方面,它可以应用于我的应用程序中的多个包。它是一个大型 spring Web 应用程序,具有许多模块。每个模块都有自己的控制器、服务和 DAO。我定义的切入点针对包内每个 类 上的所有 public 方法。控制器为 public * com.abc.module1.controllers.*.*(..)
,服务为 public * com.abc.module1.services.*.*(..)
,模块 1 中的 DAO 为 public * com.abc.module1.daos.*.*(..)
。我有大约 30 个这样的模块。所以问题是,为了涵盖所有这些模块,我必须为每个模块定义切入点。所有模块都遵循相同的包结构。有没有一种方法可以指定可以覆盖放置在不同模块中的所有 controllers
、services
的切入点? 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,您还需要将您的简单切入点升级到上述更明确的切入点之一。