我读到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中引用.