代理模式
代理模式:
Spirng AOP就是基于代理模式实现的。代理模式是对目标对象功能的一种增强,让目标对象的功能更强大、完善。是一种切面编程,可以减少重复代码。
缺点:程序设计更复杂,增加了更多的类。
静态代理:
以硬编码的形式去代理指定的目标对象,代理类增强目标对象的功能。例如servie类的方法处理功能逻辑,然后调用dao操作数据库,调用后再做一些处理,service(代理类)增强了dao(目标对象)的功能。
缺点:违背开闭原则,不利于扩展。
动态代理:
一般是在框架层使用的比较多。
jdk动态代理:
是jdk提供的动态代理功能,基于反射机制,创新一个新的代理目标对象,动态调用原目标对象的方法实现
特点:使用jdk动态代理要求目标对象必须有实现过接口
缺点:使用反射机制,效率较低,性能较低
1 public class JdkDynamicProxy implements InvocationHandler { 2 /*private Object target; 3 4 public IPerson getInstance(Class clazz) { 5 this.target = person; 6 IPerson proxyPerson = (IPerson) Proxy.newProxyInstance(person.getClass().getClassLoader(), 7 person.getClass().getInterfaces(), this); 8 return proxyPerson; 9 }*/ 10 11 private Object o;//原目标对象 12 public Object getInstance(Class clazz){ 13 return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);//返回生成的新代理目标对象 14 } 15 16 @Override 17 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 18 System.out.println("前处理"); 19 Object result = method.invoke(this.o, args);//原目标对象调用方法 20 System.out.println(result.toString()); 21 System.out.println("end、、"); 22 return result; 23 } 24 25 public JdkDynamicProxy(Object o) { 26 this.o = o; 27 } 28 }
测试类:
public class DynamicProxyTest { public static void main(String[] args) { JdkDynamicProxy proxy = new JdkDynamicProxy(new ZhangSan());//拿到代理对象,并把目标对象通过构造函数设置进去 IPerson instance = (IPerson) proxy.getInstance(ZhangSan.class);//获取新的代理目标对象 instance.eat(11);//调用方法 } }
cglib动态代理:cglib是Spring提供的,使用的时候要引入cglib的jar包,生成新的对象是继承原目标对象,
优点:不要求实现接口,是个类就可以被使用代理,比jdk代理性能好
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)