Spring提供了JDK 和CGLIB两种方式来生成代理对象 默认的代理对象生成策略为:如果是目标类接口,则使用JDK动态代理技术 否则使用CGLIB动态代理技术
JDK动态代理:
主要通过java.lang.reflect包中的Proxy类和InvocationHandler接口实现,InvocationHandler是一个接口,不同的实现类定义不同的实现逻辑,并通过反射机制调用目标类的代码,动态的将横切逻辑和业务逻辑编制在一起.Proxy类利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象
CGLIB代理:
CGLIB底层通过字节码框架ASM来实现,通过转换字节码生成新的类
CGLIB和JDK动态代理的区别:
JDK只能为接口创建代理实例,而对于没有通过接口定义业务方法的类,只能通过CGLIB创建动态代理来实现