当一个对象(客户端)不能或者不想直接引用另一个对象(目标对象),这时可以应用代理模式在这两者之间构建一个桥梁--代理对象。代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与目标类之间通常会存在关联关系,一个代理类的对象与一个目标类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用目标类的对象的相关方法,来提供特定的服务。 按照代理对象的创建时期不同,可以分为两种: 静态代理:程序员事先写好代理对象类,再对其编译,在程序运行前就已经存在了; 动态代理:应用程序发布后,在运行时,运用反射机制动态创建代理对象。
1.jdk动态代理
jdk动态代理,创建的代理类(自动创建)和目标类实现了相同的接口,目标对象作为代理对象的一个属性,从而使得在调用目标对象相应方法时,可在其前后添加其他业务逻辑。所以jdk代理只能针对实现了接口的类。
2.cglib代理
cglib(code generation library)代理不仅能进行接口代理,也能进行类代理,是对指定的类生成一个子类,覆盖其中的所有方法(不能声明为final)。
使用cglib代理会产生两次构造器调用,第一次是目标类的构造器调用,第二次是CGLIB生成的代理类的构造器调用。如果需要CGLIB代理方法,请确保两次构造器调用不影响应用。