1.Java动态代理有哪两种和原理及区别(必考)
动态代理:当想要给实现了某个接⼝的类中的⽅法,加⼀些额外的处理。⽐如说加⽇志,加事务等。可以给这个类
创建⼀个代理,故名思议就是创建⼀个新的类,这个类不仅包含原来类⽅法的功能,⽽且还在原来的基础上添加了
额外处理的新功能。这个代理类并不是定义好的,是动态⽣成的。具有解耦意义,灵活,扩展性强。
动态代理的方式
基于接口实现动态代理: JDK 动态代理
基于继承实现动态代理: Cglib、Javassist 动态代理
JDK动态代理:在动态代理中我们不再需要再手动的创建代理类,我们只需要编写一个动态处理器就可以了。真正的代理对象由JDK 在运行时为我们动态的来创建。
总结:
优点:相对于静态代理,动态代理大大减少了开发任务,同时减少了对业务接口的依赖,降低了耦合度。
缺点:Proxy 是所有动态生成的代理的共同的父类,因此服务类必须是接口的形式,不能是普通类的形式,因为 Java无法实现多继承。
CGLib 动态代理:CGLib 采用了底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。但因为采用的是继承,所以不能对 final 修饰的类进行代理。JDK动态代理与 CGLib 动态代理均是实现 Spring AOP 的基础。
总结:CGLib 创建的动态代理对象比 JDK 创建的动态代理对象的性能更高,但是 CGLIB 创建代理对象时所花费的时间却比 JDK 多得多。所以对于单例的对象,因为无需频繁创建对象,用 CGLIB 合适,反之使用 JDK 方式要更为合适一些。同时由于 CGLib 由于是采用动态创建子类的方法,对于 final 修饰的方法无法进行代理。

浙公网安备 33010602011771号