Spring AoP在切入点中以某个字符串结尾的任何包中的所有类的所有方法为参考

时间:2018-07-20 01:21:34

标签: java spring spring-aop

我想引用任何切入点中某个String结尾的包中所有类的所有公共方法。

我尝试过:

def count_even(nums):
    evens = [number for number in nums if number % 2 == 0]
    return sum(evens)

编辑:由于我要引用的类全部来自应用程序上下文,所以我知道可以使用bean()来做到这一点

@Pointcut("execution(public * *.*SomeString.*(..))")

但是我更喜欢使用execute()。

2 个答案:

答案 0 :(得分:5)

*.*SomeString的问题在于,它仅在第一包级别(例如foo.BarSomeStringhello.MySomeString)中查找,而在诸如为foo.aaa.bbb.BarSomeStringhello.xxx.MySomeString

如果程序包名称完全不相关,则可以使用通配符:

execution(public * *..*SomeString.*(..))

顺便说一句,如果您使用的是完整的AspectJ而不是Spring AOP,则可以使用此快捷方式(我不知道为什么Spring AOP不喜欢它,因为它还使用AspectJ库进行切入点匹配):

execution(public * *SomeString.*(..))

如果要在其下定义基本后备箱和子包,则可以使用..语法:

execution(public * de.scrum_master..*SomeString.*(..))

后者的替代方法是使用within()来限制包装:

execution(public * *(..)) && within(de.scrum_master..*SomeString)

顺便说一句,在AspectJ中,您确实需要execution()切入点,因为它具有更多的切入点类型,但是在Spring AOP中隐式地,所有切入点都是执行切入点,因为这是Spring AOP支持的唯一连接点类型,因为其基于代理的性质。所以你也可以这样写:

within(de.scrum_master..*SomeString)

对于基于接口的代理(Java动态代理),这是相同的,因为仅支持公共方法。唯一的区别是,对于CGLIB代理(当代理类而不是接口或通过对所有代理进行配置时),这也将与受保护的和程序包作用域的方法匹配。


有点偏离主题,这是不针对类而是针对具有特殊后缀的方法进行的相同操作:

execution(public * *SomeString(..))

如果您还想限制包/类的范围,可以将其组合:

execution(public * *SomeString(..)) && within(de.scrum_master..*)

或等效地:

execution(public * de.scrum_master..*SomeString(..))

因此,如果您想一次限制软件包,类和数学名称,请执行以下操作:

execution(public * de.scrum_master..*Controller.*SomeString(..))

或等效地:

execution(public * *SomeString(..)) && within(de.scrum_master..*Controller)

答案 1 :(得分:0)

您可以结合使用executionwithin切入点来满足您的需求。

您可以使用within选择以某个子字符串结尾的类的所有方法,如下所示:

within(*..*SomeString)

您可以使用execution选择所有公共方法,例如:

execution(public * *(..))

结合起来,他们将选择所有以某个特定子字符串结尾的类的所有公共方法

within(*..*SomeString) && execution(public * *(..))