1.JDK动态代理
private,protected final方法肯定不能被代理,因为接口就不支持private protected final方法
static 方法不能被代理
2.CGLIB动态代理
1.private
private方法肯定是不能被代理的,因为子类和其它类都不能访问一个类的私有方法
2.protected
protected方法到是可以被代理,但是CGLIB是基于继承关系来实现的,生成的代理类中对于protected的代理方法,也是protected的,访问范围受限制
3.final
final修饰的方法不能被代理,因为final修饰的方法不能被子类重写,会报错
final修饰的类 不能被代理,因为final修饰的类不能被继承
4.static
静态方法不能被代理
总结:
Spring事务基于Spring AOP,Spring AOP底层用的动态代理,动态代理有两种方式:
- 基于接口代理(JDK代理)
- 基于接口代理,凡是类的方法非public修饰,或者用了static关键字修饰,那这些方法都不能被Spring AOP增强
- 基于CGLib代理(子类代理)
- 基于子类代理,凡是类的方法使用了private、static、final修饰,那这些方法都不能被Spring AOP增强 由于是继承关系,无法代理final的类和方法(无法继承),或是private的方法(对子类不可见)。
protected 方法的作用域范围:
1>同package下可以随意访问
2> 不在同一包下的子类可以在这个子类中访问父类的protected方法
final方法规则
规则1:final修饰的方法不可以被重写。
规则2:final修饰的方法仅仅是不能重写,但它完全可以被重载。
规则3:父类中private final方法,子类可以重新定义,这种情况不是重写。