当前位置: 首页 > 知识库问答 >
问题:

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

慕容弘懿
2023-03-14

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


共有1个答案

苏健柏
2023-03-14

我建议您阅读AspectJ文档,例如。

  • 类型模式的正式定义,

那么你就不需要在这里问这样的问题了。

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

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而不是成熟的AbulJ,您可以使其更加简单,因为Spring AOP基本上只知道执行(),而不知道其他切入点,如call(),构造函数执行,set()/get()等。

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

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

 类似资料:
  • 我在我的Scala项目中使用带有sbt-aspectj的AeyJ库。我正在尝试使用表达式编写: 但我有以下例外: 以下AspectJ教程介绍: 因此,通过注释样式,可以仅在@pointcut表达式中使用if()切入点。if()不能包含任何正文。然后,带注释的@切入点方法必须是公共静态布尔的形式,并且可以像往常一样使用形式绑定 可以在Scala方法上使用切入点中的if()表达式吗?

  • 怎么了?各位! 我正在尝试拦截所有名称中包含特定单词的类...如下所示: 我有以下拦截方法: 我试过:(有效,但看起来很可怕) 谢谢!!!

  • 我正在寻找在嵌入式Jetty WebAppContext contextPath中的通配符支持,但无法找到任何。我有以下代码为我的购物WebApp: 我希望,如果访问http://ip:port/shopping/任何东西,它应该加载我上面的WebApp。但事实并非如此。我也尝试了path=“/shopping/*”,但它也不起作用。 这里有人能帮助我吗,如果它可能或不可能,或者我在这里做错了什么

  • 我使用的是Spring security 3.2.0和Spring框架的相同版本。Spring security在我的项目中工作得很好。为了保护DAO类(和其他类)中的方法,我希望使用以下切入点方法(在文件中)。 我希望指定的pointcut表达式能够保护包内所有类中的所有方法,并且只能由具有指定权限的用户访问。

  • 是否可以根据方法参数名称匹配切入点表达式? 例如,我想将所有方法与作为参数进行匹配。 我无法按数据类型进行匹配,因为它太宽了。 我知道我可以使用通配符匹配任何内容,例如执行(**(..)” 并检查方法体中的参数名称,但这似乎过多?

  • 问题内容: 我列出了大约12万个英语单词(基本上是该语言中的每个单词)。 我需要一个正则表达式,允许使用通配符aka 和来搜索这些单词。 一些例子: 如果用户搜索,它会匹配,例如或或。 如果用户搜索(以结尾的任何单词),则它将匹配或或或。 现在,大多数用户(尤其是对正则表达式不熟悉的用户)都知道,该用户只能替换1个字符,而可以替换0、1个或多个字符。我绝对想基于此构建我的搜索功能。 我的问题是:如