为什么Spring AOP在某些情况下会拦截受保护的方法?

我读到Spring AOP无法拦截私有和受保护的方法,但它以奇怪的方式拦截它们为什么会这样?

我有这些我想拦截的功能:

public String getName(String string) {
   System.out.println("Name : " + name + string);
   return name;
}

protected String getNamesprotected(String string) {
  System.out.println("Name : " + name + string);
  return name;
}

这是我的@Aspect代码:

@Aspect
public class Logging {

    @Before("execution(* com.tutorialspoint.Student.*Name*(..))")
    public void beforeAdvice(JoinPoint joinPoint){
       System.out.println("Going to setup student profile."+joinPoint.getSignature().toString());
    }
}

执行此代码时,getName和getNamesprotected都会被拦截,但是当我执行此代码时:

@Aspect
public class Logging {

    @Before("execution(* com.tutorialspoint.Student.getNamesprotected(..))")
    public void beforeAdvice1(JoinPoint joinPoint){
       System.out.println("Going to setup student profile."+joinPoint.getSignature().toString());
    }
}

然后什么也没有截获.我也尝试用* getNamesprotected *替换getNamesprotected但仍然没有拦截.它仅在* Name *存在时截取.

任何人都可以解释我为什么会这样吗?

解决方法:

因为OP(Prateek Gupta)似乎无法(相当不愿意)创造一个小小的SSCCE再现问题,而我在茶歇期间感到很无聊,我很快就用Spring Boot自己创建了一个,并且确实对Spring AOP感到非常惊讶与文档相矛盾的是,当涉及CGLIB代理时,至少在某些情况下与受保护方法匹配.

因此,我在Spring的Jira问题跟踪器上注册了一个帐户,并将此回归报告为SPR-15354.如果对Spring开发团队的答案感兴趣,您可能希望订阅该票证的更新.

更新:回复我的机票的人告诉我这是一个文档问题.从2006年的SPR-1611告诉我们,这已经在Spring 1.2.7中有意改变,但从未在文档中找到过.底线:受保护的方法可以通过Spring AOP捕获,这不是一个意外,但已经没有记录12年.

更新2:更新的文档文本将在下一个Spring版本中.如果您想今天阅读固定文本,请在SPR-1611中引用.

上一篇:actuator微服务信息完善


下一篇:spring boot actuator监控