如何通过将切入点作为用户输入来为遗留代码应用 spring aop

how to apply spring aop for legacy code by taking pointcut as input from user

我必须对遗留代码应用 Spring AOP,而不更改现有代码中的任何内容。没有 bean 概念,对象是使用 new 关键字创建的,因此没有使用 applicationContext.getBean("beanName") 的范围。此外,切入点将作为最终用户的输入,并且会有一个共同的方面class。

例如

package package1;

public class Demo1 {

public void method1()
{
    System.out.println("From method1");
}

public void method2()
{
    System.out.println("From method2");
}

}


package package2;

public class Demo2 {

public void method3()
{
    System.out.println("From method3");
}

public void method4()
{
    System.out.println("From method4");
}

}

package aspects;

public class SpringAspect {

public void beforeAdvice(JoinPoint jointPoint)
{
    System.out.println("Before method : "+jointPoint.getSignature());
}

}

作为最终用户输入的切入点如下,它们之前的顾问方法是来自 aspects.SpringAspect class 的 beforeAdvice() : 执行(* package1.Demo1.method1(..)) 执行(* package2.Demo2.method4(..))

此外,如果无法使用 Spring AOP,我如何在运行时使用 AspectJ 来实现同样的效果。

首先,你所谓的方面缺少@Aspect@Before等方面相关的注释,没有它它只是一个POJO class。它永远不会被执行,甚至不会被识别为一个方面。

其次,Spring AOP 是一个基于代理的框架,它只适用于 Spring 组件,不适用于 POJO classes。你需要 AspectJ 来解决你的问题。 (顺便说一句,你读过教程或 Spring 或 AspectJ 手册吗?我猜你没有。)

此外,您究竟为什么要让用户在运行时输入切入点?您是否应该早点知道在哪里应用您的方面?即使我向您展示一个动态创建方面的解决方案,它们也不会很有价值,因为即使加载时织入也需要在 class 加载期间检测您的 Java 代码。如果目标 classes 已经加载,则无法在其上应用方面 post factum。

也许你应该解释你想要实现什么,而不是问如何在技术上做一些没有意义也行不通的事情,这样无论如何也解决不了你的问题。

如果你想要一种更动态的方式来定义你的切入点而不是在你的切面中硬编码它们,你可以创建一个带有抽象切入点的抽象基本切面并定义aop.xml 文件中的具体切入点,用于加载时编织,如 AspectJ documentation 中所述。 =13=]

希望对您有所帮助。