为什么要有动态代理:

Spring里面使用aop,比如说你对一些类和他们的方法做了一个切面,定义好了要在这些类的方法里面增强的代码,Spring必然要对那些类生成动态代理.在动态代理中去执行你定义的一些增强的代码.

两种动态代理区别

如果类实现了某个接口的,Spring的aop会使用jdk的动态代理, 生成一个跟你实现同样的接口的一个代理类,构造一个实例对象出来. jdk动态代理其实是在你的类有接口的时候就会使用.
很多时候我们可能某个类是没有实现接口的,此时Spring的AOP会改用cglib来生成动态代理. CGlib是是可以动态的生成字节码的. 生成你的类的子类,然后子类覆盖你的一些方法,在方法里面家里你定义的增强的代码.

  1. 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
    优点:因为有接口,所以使系统更加松耦合
    缺点:为每一个目标类创建接口
  2. 若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
    优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。
    缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。