一、 概念:
代理是一种设计模式,提供了对目标对象另外的访问方式;即通过代理访问目标对象。这样的好处是可以在目标对象实现的基础上,增强额外的功能操作。(扩展目标对象的功能)。代理模式的关键点:代理对象与目标对象。
二、代理的类型
分为两种:静态代理和动态代理
1、静态代理:
静态代理是指程序运行钱就已经存在了代理类的字节码文件,代理类和被代理的关系在运行前就已经确定了。
静态代理的特点:
- 可以在不修改目标对象的前提下,对目标对象功能扩展。
- 因为代理对象需要与目标对象实现一样的接口, 所以会有很多代理类(类太多)。
- 一旦接口增加方法,目标对象与代理对象都要维护(维护麻烦)。
- 一个静态代理类只代理一个具体类,如果需要对实现了同一接口的不同具体类做代理,静态代理需要为每一个具体类创建相应的代理类。
2、动态代理
- 动态代理类的字节码是在程序运行期间动态生成的所以不存在代理类的字节码文件。
代理类和被代理的关系是程序在运行期间确定的。 - JDK从1.3开始引入动态代理。可铜鼓java.lang.reflect.proxy类的静态方法Proxy.newProxyInstance动态创建代理和实例。并且由它们动态创建出来的代理类都是Proxy类的子类。
三、代理行为
代理类往往会在代理 对象 业务逻辑前后增加一些功能性的行为,如使用事务或者打印日志。把这些行为称之为代理行为。
四、Spring AOP底层实现原理(代理模式)
Spring的AOP有JDK动态代理和cglib两种实现方式。
JDK动态代理要求被代理对象实现接口。
cglib通过动态继承实现,因此不能代理被final修饰的类;
JDK动态代理生成代理对象速度比cglib快。
cglib生成的代理对象比JDK动态借生成的对象执行效率高。
五、JDK动态代理与cglib对比
- 字节码创建方式:
JDK动态代理通过JVM实现代理类字节码的创建cglib通过ASM创建字节码。 - 对被代理对象的要求:
JDK动态代理要求被代理对象实现接口,cglib要求被代理对象未被final修饰。 - 代理对象创建速度:
JDK动态代理创建代理对象速度比cglib快。 - 代理对象执行速度:
cglib代理对象执行速度比JDK动态代理快。