代理模式

代理模式:

  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代理性能好

 

posted @   Mr_罗先生  阅读(59)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
点击右上角即可分享
微信分享提示