Spring AOP代理为何无法拦截private方法与静态方法
基础版来源:jd中级工程师final类与方法CGLIB代理JDK动态代理Spring AOP代理机制
答案解析
Spring AOP 默认采用 代理模式 实现,拦截的前提是:方法调用必须经过代理对象,并且能够通过多态被代理类重写或转发。
private 方法 :private 方法对子类不可见,也不能被重写。CGLIB 是通过生成子类并重写方法实现拦截,因此无法重写 private 方法;JDK 动态代理只能代理接口中可访问的方法,也无法代理 private 方法。 静态方法 :静态方法属于类,不属于某个对象,调用时根据类直接绑定,不经过实例对象的多态分派。CGLIB 生成子类也只能隐藏静态方法,不能真正重写它,因此 Spring AOP 无法通过代理拦截静态方法。
另外,即使是 public 方法,如果在目标类内部通过 this.xxx() 自调用,也不会经过代理对象,同样不会触发切面。
通常的处理方式是把需要增强的逻辑放到可代理的 public/protected 实例方法中,并通过 Spring Bean 的代理对象调用。如果确实需要拦截 private 或静态方法,可以考虑 AspectJ 编译期或类加载期织入;不过静态方法一般更建议改造成实例方法,降低
登录后查看完整内容
