Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在带有注释的字段上调用的方法的Spring AOP切入点_Java_Spring_Annotations_Aop_Spring Aop - Fatal编程技术网

Java 在带有注释的字段上调用的方法的Spring AOP切入点

Java 在带有注释的字段上调用的方法的Spring AOP切入点,java,spring,annotations,aop,spring-aop,Java,Spring,Annotations,Aop,Spring Aop,我正在编写一个方面,使来自外部库的依赖项能够返回为我的应用程序正确格式化的值 考虑到这一点,我创建了一个名为@SafeReturns的注释。 我在spring的帮助下从外部库连接这个类,此外,我还添加了注释 @SafeReturns @Autowired public PermissionsClient client; 现在我尝试对它进行一个方面的研究,但不幸的是,我无法捕获对使用此注释注释的字段上的所有方法的所有调用。我尝试了不同的切入点。e、 g @Pointcut("execution

我正在编写一个方面,使来自外部库的依赖项能够返回为我的应用程序正确格式化的值

考虑到这一点,我创建了一个名为@SafeReturns的注释。 我在spring的帮助下从外部库连接这个类,此外,我还添加了注释

@SafeReturns
@Autowired
public PermissionsClient client; 
现在我尝试对它进行一个方面的研究,但不幸的是,我无法捕获对使用此注释注释的字段上的所有方法的所有调用。我尝试了不同的切入点。e、 g

@Pointcut("execution(@myApp.SafeReturns * *(..))")

@Around("safeReturnsPointCut()")
public void logAround(ProceedingJoinPoint joinPoint) throws Throwable {    
}

它们都不能帮助我实现捕获所有方法的行为。有办法抓住他们吗

您的方法和您对方面语法和执行逻辑的假设存在几个问题:

  • 您使用的是SpringAOP,但由于其基于代理的特性,该AOP只适用于SpringManagedBean/组件,如中所述。它不适用于非Spring第三方代码

  • 为了瞄准第三方代码,您需要通过LTW(加载时编织)使用完整的AspectJ。SpringAOP手册也解释了这一点

  • 您的切入点表示要针对所有方法执行(如果您使用的是Spring AOP,则针对Spring组件),其中的方法由
    SafeReturns
    注释。无论是使用SpringAOP还是AspectJ,您都不能期望这种语法应用于碰巧被分配给带有特定注释的实例成员变量的对象。因此,您对AOP如何工作以及它如何工作的期望是相当不同的

我的建议是通过LTW切换到AspectJ,然后编写切入点,直接以外部方法
execution()
s为目标,或者通过将外部调用路由到带注释的外观并以切入点为目标来间接解决问题。如果正面是Spring组件,这甚至可以用于Spring AOP

通过高级AspectJ+一些手动簿记,也有一种直接的解决方法。您可以使用
set()。然后,您可以让aspect对指定的对象进行手动簿记,并确保只有当相关对象碰巧被指定给带注释的成员变量时,才触发aspect建议所做的任何操作。这是可行的,我过去也这样做过。但这意味着您必须编织应用程序的所有方法调用,然后通过簿记中的查找动态决定是否应执行代码,因为可能存在未分配给任何注释字段的对象实例。这会导致一定的性能损失,因为任何aspect weaver都无法在编译时确定这种情况。有关手动簿记的示例代码,请参见


我希望我的解释不是太复杂,但你的问题是相当技术性和复杂的。

它适用的方法和不适用的方法有什么区别?我想您在logAround中有继续调用吗?方面在上下文中。但是,它不适用于现场有安全回报的情况。。。。字段不是切入点。你到底想在这里做什么?我想捕获对声明为字段且具有此注释的对象的所有方法调用。这不是它的工作方式,你需要将注释添加到方法本身。感谢你在3年多后接受我的答案。为了记住它的内容,我不得不再读一遍。FWIW,我也再读了一遍,并补充了一些关于缺点的评论,以及为什么我总体上不喜欢手动簿记解决方案。