代理设计模式分类:
Ⅰ、静态代理模式:
①、为什么需要:静态代理模式?
为了:减轻(需要:代理)的人的(工作量); 比如:雇主 和 管家
②、静态代理:是什么?
静态代理就是:一种( 访问者 --> 代理 -- >真实对象 )的设计模式。
③、怎么实现:静态代理?
1、创建:真实对象类
2、创建:代理对象类(其中 private 真实对象 作为属性)
3、创建:公共接口(具体是:功能)
4、真实对象类:实现接口 (写自己直接做的事)
5、代理对象类:实现接口(写出前置通知 、 调用真实对象实现方法、再写出后置通知)
Ⅱ、动态代理模式:
①、为什么需要:动态代理模式?
因为:静态代理(不方便):每增加(一个)功能:接口就要写一个方法、代理再次复写。
②、动态代理:分为哪两种?
1、动态是什么?
动态,指的是代理类实在程序运行时创建的,而不是在程序运行前手动编码来定义代理类的。(与静态比较)
2、JDK动态代理
㈠、JDK动态代理:是什么?**
是java JDK利用反射机制:在运行中创建代理的一种设计模式。(需要创建:功能接口)
㈡、JDK动态代理:怎么用?
1、创建:需代理的(对象类)
2、创建:需代理对象的(功能接口)
3、(需代理对象类):实现(功能)接口
4、创建:代理对象类(并且实现: InvocationHandler )接口
5、在(代理对象类中):创建(需代理)对象
6、在(代理对象类中)实现:(invoke方法) 并且书写:前置、method调用功能、 后置
7、在测试类中:创建(功能类) = 利用Proxy.newInstance(测试类(类加载器), new Class[]功能类,代理对象 )
8、功能类调用:方法即可
㈢、JDK动态代理:优点
优点:jdk 自带,不需要额外导入 jar
㈣、JDK动态代理:缺点
3、cjlib动态代理
㈠、cjlib动态代理:是什么?
cglib是一个java字节码的生成工具,它动态生成一个被(代理类的子类),
子类重写被代理的类的(所有不是final的方法)。
在子类中(采用方法拦截的技术)拦截所有(父类方法)的调用,顺势织入(横切逻辑)。
㈡、cjlib动态代理:怎么用?
1、导入jar:cjlib、asm
2、创建:被代理的类,并且写相关:功能方法
3、创建:代理类(实现MethodInterceptor)方法拦截器(选择调用父类方法)
4、创建:测试类
5、在测试类中:创建:拦截增强器(Enhancer)
6、通过增强器:设置(被代理)(子类)setSuperclass(.class)
7、通过增强器:设置:(被代理对象)调用
8、通过增强器:创建(被代理对象)
9、被代理对象:调用相关方法(即可)
㈢、cjlib的优点:
①、基于字节码,生成真实对象的子类:效率高于Java JDK动态代理
②、不需要实现:接口
㈣、cglib 缺点:
非 JDK 功能,需要额外导入 jar
㈤、注意:使用 spring aop 时,只要出现 Proxy 和真实对象转换异常
①、XML中:<aop:aspectj-autoproxy
proxy-target-class="true"></aop:aspectj-autoproxy>
②、cglib 设置为 true 使用
③、默认(为false)JDK