我想引用任何切入点中某个String结尾的包中所有类的所有公共方法。
我尝试过:
def count_even(nums):
evens = [number for number in nums if number % 2 == 0]
return sum(evens)
编辑:由于我要引用的类全部来自应用程序上下文,所以我知道可以使用bean()来做到这一点
@Pointcut("execution(public * *.*SomeString.*(..))")
但是我更喜欢使用execute()。
答案 0 :(得分:5)
*.*SomeString
的问题在于,它仅在第一包级别(例如foo.BarSomeString
或hello.MySomeString
)中查找类,而在诸如为foo.aaa.bbb.BarSomeString
或hello.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)
您可以结合使用execution
和within
切入点来满足您的需求。
您可以使用within
选择以某个子字符串结尾的类的所有方法,如下所示:
within(*..*SomeString)
您可以使用execution
选择所有公共方法,例如:
execution(public * *(..))
结合起来,他们将选择所有以某个特定子字符串结尾的类的所有公共方法。
within(*..*SomeString) && execution(public * *(..))