我正在使用 Boot 和org.Springframework.boot:spring-boot-starter-aop
我无法使aroundParseInt方面触发。
我做了另一个方面测试(test1),这个测试正在触发。
我试图做的是拦截parseInt的参数并修改它(需要)。
import static java.lang.System.currentTimeMillis;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
@Aspect
public class TransformIntegerAspect {
// THIS test aspect WORKS
@Around("execution(* *(..)) && within(bknd.Siam.Dao.cobros.D_Cobros_Admin)")
public Object test1(ProceedingJoinPoint thisJoinPoint) throws Throwable {
long startTime = currentTimeMillis();
Object result = thisJoinPoint.proceed();
System.out.println(thisJoinPoint + " -> " + (currentTimeMillis() - startTime) + " ms");
LoggerManager.log("ISAAC measureExecutionTime");
return result;
}
//this dont work
@Around("execution(int java.lang.Integer.parseInt(String))")
public Object aroundParseInt(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] args = joinPoint.getArgs();
String param = (String) args[0];
// Modify the parameter before the call to Integer.parseInt
String modifiedParam = modifyParam(param);
args[0] = modifiedParam;
Object result = joinPoint.proceed(args);
return result;
}
private String modifyParam(String param) {
// Your custom logic to modify the parameter
// Return the modified parameter\
return param;
}
配置文件中还有@EnableAspectJAutoProxy(proxyTargetClass=true)
和Bean
@Bean
public TransformIntegerAspect transformParseIntAspect() {
return new TransformIntegerAspect();
}
我有一些谷歌代码,不能使它工作。
也有人说这是可能的,而其他人说这是不可能的。
“如果它们是由第三方库创建的,您仍然可以使用二进制编织,创建第三方类文件的新版本并为它们创建替换JAR。作为替代,您可以使用LTW(加载时织入)并在类加载期间织入它们。
我期待着找到是否真的可能或不和一个替代的方式,而不使一个实用程序的方法。
1条答案
按热度按时间jhkqcmku1#
Spring AOP只能拦截Spring bean/组件的方法,但您正在尝试拦截JDK方法。这是有据可查的,以前在这里被问过几十次。下次请做一些研究并阅读一些文档。
原生AspectJ可以拦截它织入的任何类中的任何方法,但是对于JDK类,当使用加载时织入时,这也可能是一个问题,因为许多(不是所有)JDK类在AspectJ织入代理之前加载,然后AspectJ修改它们就太晚了。一种间接的方法是编织调用代码,而不是包含和执行方法的类。在这种情况下,您将使用
call
而不是execution
切入点。请注意,call
在Spring AOP中不可用,这是使用原生AspectJ的第二个原因。例如:在您的例子中,目标方法是静态的,这就是为什么您需要原生AspectJ的原因#3,因为Spring AOP再次无法拦截静态方法。