[英]Spring AOP Pointcut for methods invoked on field with annotation
我正在写一个方面,以使外部库中的依赖关系返回为我的应用程序正确格式化的值。
考虑到这一点,我创建了一个名称为@SafeReturns的注释。 我在spring的帮助下从外部库连接了该类,此外,还添加了注释。
@SafeReturns
@Autowired
public PermissionsClient client;
现在,我尝试对此做一个介绍,但是不幸的是,我无法在该注释所注释的字段上捕获对所有方法的所有调用。 我尝试了不同的切入点。 例如
@Pointcut("execution(@myApp.SafeReturns * *(..))")
@Around("safeReturnsPointCut()")
public void logAround(ProceedingJoinPoint joinPoint) throws Throwable {
}
它们都不能帮助我实现捕获所有方法的行为。 有没有办法抓住他们?
您的方法以及关于方面语法和执行逻辑的假设存在几个问题:
您正在使用Spring AOP,但是由于其基于代理的特性,因此只能与Spring管理的bean /组件一起使用,如Spring AOP手册中所述 。 它不适用于非Spring第三方代码。
为了定位第三方代码,您需要通过LTW(加载时编织)使用完整的AspectJ。 Spring AOP手册还介绍了如何配置LTW 。
您的切入点说的是针对所有方法执行(如果使用Spring AOP,则是Spring组件的方法执行),其中方法由SafeReturns
注释。 无论是Spring AOP还是AspectJ,您都不能期望此语法适用于恰好被分配给具有特定注释的实例成员变量的对象。 因此,您对如何实现AOP以及如何实现AOP的期望大相径庭。
我的建议是通过LTW切换到AspectJ,然后编写切入点,该切入点可以直接针对外部方法execution()
,也可以通过将外部调用路由到带注释的Facades上并使用切入点作为目标来间接解决问题。 如果外观是Spring组件,则甚至可以使用Spring AOP。
还有一种通过高级AspectJ +一些手动簿记解决此问题的直接方法。 您可以使用set()
切入点来确定何时将对象分配给您的带注释的字段(或以后未分配)。 然后,您可以让Aspect对指定的对象进行手动记账,并确保仅当相关对象恰好被分配给带注释的成员变量时,才触发您的方面建议所做的任何事情。 这项工作,我过去也曾做过。 但这意味着您必须编织所有应用程序的方法调用,然后通过簿记中的查询动态决定是否应执行代码,因为可能存在未分配给任何带注释的对象实例领域。 这会导致一定的性能损失,因为这种情况在编译期间无法由任何方面的织工确定。 请在此处查看我的答案,以获取有关手动簿记内容的示例代码。
我希望我的解释不太复杂,但是您的问题是技术性和复杂性高的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.