| 1) 静态代理和JDK代理模式都要求目标对象是实现一个接口,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候可使用目标对象子类来实现代理-这就是Cglib代理 |
| 2) Cglib代理也叫作子类代理,它是在内存中构建一个子类对象从而实现对目标对象功能扩展, 有些书也将Cglib代理归属到动态代理。 |
| 3) Cglib是一个强大的高性能的代码生成包,它可以在运行期扩展java类与实现java接口.它广泛的被许多AOP的框架使用,例如Spring AOP,实现方法拦截 |
| 4) 在AOP编程中如何选择代理模式: |
| 1. 目标对象需要实现接口,用JDK代理 |
| 2. 目标对象不需要实现接口,用Cglib代理 |
| 5) Cglib包的底层是通过使用字节码处理框架ASM来转换字节码并生成新的类 |
| 1) 需要引入cglib的jar文件 |
| 2) 在内存中动态构建子类,注意代理的类不能为final,否则报错java.lang.IllegalArgumentException: |
| 3) 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法 |


| package com.atguigu.proxy.cglib; |
| public class TeacherDao { |
| public String teach() { |
| System.out.println(" 老师授课中 , 我是cglib代理,不需要实现接口 "); |
| return "hello"; |
| } |
| } |
| |
| package com.atguigu.proxy.cglib; |
| import java.lang.reflect.Method; |
| import net.sf.cglib.proxy.Enhancer; |
| import net.sf.cglib.proxy.MethodInterceptor; |
| import net.sf.cglib.proxy.MethodProxy; |
| public class ProxyFactory implements MethodInterceptor { |
| |
| |
| private Object target; |
| |
| |
| public ProxyFactory(Object target) { |
| this.target = target; |
| } |
| |
| |
| public Object getProxyInstance() { |
| |
| Enhancer enhancer = new Enhancer(); |
| |
| enhancer.setSuperclass(target.getClass()); |
| |
| enhancer.setCallback(this); |
| |
| return enhancer.create(); |
| } |
| |
| |
| @Override |
| public Object intercept(Object arg0, Method method, Object[] args, MethodProxy arg3) throws Throwable { |
| |
| System.out.println("Cglib代理模式 ~~ 开始"); |
| Object returnVal = method.invoke(target, args); |
| System.out.println("Cglib代理模式 ~~ 提交"); |
| return returnVal; |
| } |
| |
| } |
| |
| package com.atguigu.proxy.cglib; |
| public class Client { |
| |
| public static void main(String[] args) { |
| |
| TeacherDao target = new TeacherDao(); |
| |
| TeacherDao proxyInstance = (TeacherDao)new ProxyFactory(target).getProxyInstance(); |
| |
| String res = proxyInstance.teach(); |
| System.out.println("res=" + res); |
| } |
| |
| } |
| 1) 防火墙代理 |
| 内网通过代理穿透防火墙,实现对公网的访问。 |
| 2) 缓存代理 |
| 比如:当请求图片文件等资源时,先到缓存代理取,如果取到资源则ok,如果取不到资源,再到公网或者数据库取,然后缓存。 |
| 3) 远程代理 |
| 远程对象的本地代表,通过它可以把远程对象当本地对象来调用。远程代理通过网络和真正的远程对象沟通信息 |

| 4) 同步代理:主要使用在多线程编程中,完成多线程间同步工作 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
2021-08-31 vue开发:前端项目模板