README
代理模式:
总:
通过代理对象来调用被代理对象的方法等
e.g.有个老师请假了,他请了一个代理教师帮他上课(1)静态代理<br /> 1)静态代理在使用时,需要定义接口或者父类,被代理对象(即目标对象)与代理对象一<br /> 起实现相同的接口或者是继承相同父类。【代理对象和被代理对象实现/继承同一个父类】<br /> 2)coding:<br /> 【1】定义接口,编写方法<br /> 【2】定义被代理对象,实现接口<br /> 【3】定义代理对象,实现接口,聚合被代理对象{利用多态,增加可扩展性}<br /> 3)总:实现同一个接口,使用多态增加程序扩展性<br /> 4)静态代理优缺点<br /> (1)优点:在不修改目标对象的功能前提下, 能通过代理对象对目标对象进行功能扩展<br /> (2)缺点:因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类;<br /> 一旦接口增加方法,目标对象与代理对象都要维护【维护成本高】(2)动态代理<br /> 1)概述<br /> (1)代理对象不需要实现接口,但是目标对象仍然要实现接口,否则不能用动态代理【被代理对象需要实现接口】<br /> (2)代理对象的生成是利用 JDK 的 API(会用到JDK的反射机制),动态地在内存<br /> 中构建代理对象(返回代理对象后,再通过代理对象去调用目标对象的方法)<br /> (3)动态代理也叫做:JDK 代理、接口代理<br /> 2)coding:<br /> 【1】接口<br /> 【2】被代理类实现接口<br /> 【3】代理对象,Proxy.newProxyInstance JDK的api<br /> /* public static Object newProxyInstance(ClassLoader loader,<br /> Class<?>[] interfaces,<br /> InvocationHandler h)<br /> * 1.ClassLoader loader:指定当前目标对象的使用的类加载器,获取加载器的方法是固定的<br /> * 2.Class<?>[] interfaces:目标对象实现的接口类型,使用泛型的方式确认类型<br /> * 3.InvocationHandler h:事件处理,执行目标对象的方法时,会触发事件处理器的方法,会把当前执行的目标对象的方法作为参数传入<br /> */(3)Cglib动态代理<br /> 1)概述<br /> 1)静态代理和JDK 代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,<br /> 并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是 Cglib 代理【通过子类代理】<br /> 2)Cglib 代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书<br /> 也将Cglib代理归属到动态代理。<br /> 3)Cglib 是一个强大的高性能的代码生成包,它可以在运行期扩展 java 类与实现 java 接口.它广泛<br /> 的被许多 AOP 的框架使用,例如 Spring AOP实现方法拦截就用到了Cglib包<br /> 4)在 AOP 编程中如何选择代理模式:【jdk代理和Cglib代理的选择】<br /> 目标对象需要实现接口,用 JDK 代理<br /> 目标对象不需要实现接口,用 Cglib 代理<br /> 5)Cglib 包的底层是通过使用字节码处理框架 ASM 来转换字节码并生成新的类
静态
ITeacherDao.javaTeacherDao.javaTeacherProxy.java
JDK动态代理
Client.javaITeacher.javaTeacherDao.javaTeacherProxy.java
cglib动态代理
CLIENT.javaTeacherDao.javaTeacherProxy.java
