一:代理是一种设计模式,它的主要作用是创建代理类代替目标对象的访问。代理在客户端与目标对象之间起到了一个中介的作用,很大程度的降低了业务代码与服务代码的耦合度(解耦)。
代理有三个要素:要有共同的行为、目标角色、代理角色。
二:代理根据实现方式分为两种:
1.静态代理,今天代理的话是在程序运行时就已经存在了,每个代理类都需要一个代理对象,这个代理对象需要人工创建。
操作:实现业务类相同的业务接口并且重写相同的业务方法,然后再调用业务方法是插入服务代码,有效的解耦。缺点:只能针对带个类进行代理,而且代码维护难度比较高。
2.动态代理,顾名思义它是在程序创建的时候动态创建的,相比较于静态代理他更加灵活,动态代理的字节码是由java的反射机制动态产生的。
三:动态代理根据实现方式分为jdk的动态代理,cglib的动态代理。
1.jdk的动态代理需要一个Object的有参构造方法来接收需要代理的类然后这个代理类实现InvocationHandler的接口并且重写他的invoke方法,然后在这个方法中使用反射调用业务类的方法并在实际调用类中使用Poxy类的newProxyInstance方法来生成代理对象,它需要三个参数,类加载器,代理类实例,被代理类的实现接口。
2.cglib的动态代理相比较于jdk的要性能要高一些,也方便一点,它是直接生成一个目标类的并且重写父类的业务方法增强它的功能,这个子类就是代理类,因此cglib的代理类必须要是能被继承的类。
四:区别
JDK代理只能对实现接口的类生成代理;CGlib是针对类实现代理,对指定的类生成一个子类,并覆盖其中的方法,这种通过继承类的实现方式,不能代理final修饰的类。
动态代理的底层原理是基于反射机制的。



