【问题标题】:Spring AOP work in one method and doesn't work in another of same class [duplicate]Spring AOP 在一种方法中工作,在同一类的另一个方法中不起作用 [重复]
【发布时间】:2021-10-03 19:47:04
【问题描述】:

我正在使用 Spring AOP 进行自定义注释,它在其他方法中触发良好,但在下面提到的方法中不起作用。我是 AOP 概念的新手,所以请帮忙。我尝试在其他运行良好的方法上使用相同的 AOP。我不知道这正在发生。很早就知道jdk代理,调用方法必须是公开的,所以我改变了,即使这样做了也没有解决我的问题。

自定义注解:

package com.abc.xyz.common.logger;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UPIPGLog {
    String type() default "OTHER";

    boolean logParams() default true;

    String[] skipRegexInResponseLog() default {};

    String[] maskInResponseLog() default {};
}

方面:

package com.abc.xyz.common.logger;

import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.EnumUtils;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@Aspect
@Order(3)
public class UPIPGAutologger{

    @Around("execution(@com.abc.xyz.common.logger.UPIPGLog * *(..)) && @annotation(upipgLog)")
    public Object performanceLog(ProceedingJoinPoint joinPoint, UPIPGLog upipgLog) {
        Object response = null;
        -
        -
        -
    }

}

调用方法:

package com.abc.xyz.handler.gateway.impl.opt.idk;

@Component
public class ABC implements XYZ {

    @UPIPGLog
    @Override
    public  <RESPONSE> RESPONSE getAPIResponse(LogType logType, Integer timeoutInSeconds, String url,
            String payload, Class<RESPONSE> responseClass, HTTPRequestType requestType, String contentType,
            Map<String, Object> headers, Map<PGConfigParameters, Object> config) {
        //
        //
    }
}

【问题讨论】:

  • 我在研究时了解到的信息 - 对于 jdk 代理解析 - AOP 的方法必须是公共的,对于 cglib 代理 - 方法可以是受保护的或公共的。
  • 并且getAPIResponse 必须由另一个组件调用,如果您只是在内部调用它public void someMethod(){ this.getAPIResponse(...) },那么简单的基于代理的机制将不起作用。建议类中的本地或内部方法调用不会被代理拦截,因此方面的建议方法不会被触发/调用
  • 谢谢@Andreas。它解决了我的问题

标签: spring spring-boot aop spring-aop aopalliance


【解决方案1】:

getAPIResponse 必须由另一个组件调用,如果你只是在内部调用它,那么简单的基于代理的机制将不起作用。

例子:

public void someMethod() {
    this.getAPIResponse(...)
}

建议类中的本地或内部方法调用不会被代理拦截,因此方面的建议方法不会被触发/调用。

我只从内部类方法调用方法。感谢@Andreas 在 cmets 中提及。

【讨论】:

    【解决方案2】:

    尝试在@annotation 中使用完全限定路径,@annotation(com.abc.xyz.common.logger.UPIPGLog)

    【讨论】:

    • 不,它没有触发 AOP
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多