Spring AOP代理机制实现原理
Spring AOP底层支持两种动态实现:
JDK原生的动态代理Cglib动态代理
Spring在创建代理对象的时候,会自动选择要使用哪种代理方案。如果被代理的类实现了接口,那么就用JDK动态代理;反之就用Cglib动态代理
JDK原生动态代理
区别静态代理每代理一个类就要创建一个专门的代理类,动态代理只需要通过一个通用的代理类,即可代理所有实现了接口的类。
Cglib动态代理
Code Generation Library,Code生成类库。使用JDK的Proxy实现代理,要求目标类与代理类实现相同的接口。若目标类不存在接口,则无法使用该方式实现。但对于无接口的类,要为其创建动态代理,就要使用Cglib来实现
两种动态代理对比
JDK动态代理要求被代理的类必须是至少实现一个接口才能代理Cglib动态代理没有上述限制,也就是说他可以代理实现了接口的类,也可以代理没实现接口的类JDK动态代理创建代理对象的原理是让创建的代理对象实现和被代理类一样的接口,从而代理接口中的方法Cglib动态代理创建代理对象的原理是让创建的代理对象继承被代理的目标类,从而代理从父类(被代理的类)中继承过来的方法