代理模式

代理模式:

  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 @ 2021-05-17 22:37  Mr_罗先生  阅读(59)  评论(0编辑  收藏  举报