• Spring-动态代理


    动态代理

    动态代理和静态代理角色一样

    动态代理的代理类是动态生成的,不是我们直接写好的

    动态代理分为两大类:基于接口的动态代理,基于类的动态代理

    1,基于接口--JDK动态代理【我们在这里使用】

    2,基于类:cglib

    3,Java字节码实现:javasist

    需要了解两个类:Proxy :代理,InvocatioHandler:调用处理程序

    InvocationHandler是由代理实例调用处理程序实现的接口。

    每个代理实例都有一个关联的调用处理程序,当在代理实例上调用方法时,方法调用将被编码并分派到其调用处理程序的invoke方法。

    proxy提供了创建动态代理类和实例的静态方法,它也是由这些方法创建的所有动态代理类的超类。

    动态代理的好处

    可以使真实角色的操作更加纯粹,不用去关注一些公共的业务

    公共业务交给代理角色,实现了业务的分工

    公共业务发生扩展的时候,方便集中管理

    一个动态代理类代理的是一个接口,一般就是对应的一类业务

    一个动态代理类可以代理多个类,只要时实现了同一个接口即可

    代码

    1 package com.nic.PeopleService;
    2 
    3 public interface PeopleService {
    4     public void add();
    5     public void delete();
    6     public void update();
    7     public void query();
    8 }
     1 package com.nic.PeopleService;
     2 
     3 public class PeopleServiceImpl implements PeopleService {
     4     public void add() {
     5         System.out.println("People增");
     6     }
     7 
     8     public void delete() {
     9         System.out.println("People删");
    10     }
    11 
    12     public void update() {
    13         System.out.println("People改");
    14     }
    15 
    16     public void query() {
    17         System.out.println("People查");
    18     }
    19 }
     1 package com.nic.Handler;
     2 
     3 import org.springframework.cglib.proxy.InvocationHandler;
     4 
     5 import java.lang.reflect.Method;
     6 import java.lang.reflect.Proxy;
     7 
     8 //自动生成代理类的类
     9 public class ProxyInvocationHandler implements InvocationHandler, java.lang.reflect.InvocationHandler {
    10     //被代理的接口(这里可以看成PeopleService)
    11     private Object target;
    12 
    13     public void setTarget(Object target) {
    14         this.target = target;
    15     }
    16 
    17     //生成得到代理的类
    18     public Object getProxy(){
    19         return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
    20     }
    21 
    22     //处理代理实例,并返回接口
    23     public Object invoke(Object o, Method method, Object[] objects) throws Throwable {
    24         proInvoke();
    25         //动态代理的本质,就是使用反射机制!
    26         Object result = method.invoke(target, objects);
    27         aftInvoke();
    28         return result;
    29     }
    30 
    31     public void proInvoke(){
    32         System.out.println("代理前处理事情");
    33     }
    34     public void aftInvoke(){
    35         System.out.println("代理后处理事情");
    36     }
    37 }
     1 import com.nic.Handler.ProxyInvocationHandler;
     2 import com.nic.PeopleService.PeopleService;
     3 import com.nic.PeopleService.PeopleServiceImpl;
     4 
     5 public class Test {
     6     public static void main(String[] args) {
     7         //真实角色
     8         PeopleService peopleService = new PeopleServiceImpl();
     9         //代理角色,不存在
    10         ProxyInvocationHandler handler = new ProxyInvocationHandler();
    11         //设置要代理的对象
    12         handler.setTarget(peopleService);
    13         //动态生成代理类
    14         PeopleService proxy = (PeopleService) handler.getProxy();
    15         proxy.add();
    16 
    17     }
    18 }

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    后端程序员写的前端js代码模板
    setTimeOut传參数
    IP地址的分类——a,b,c 类是怎样划分的
    适配高分辨率的图片High DPI Images for Variable Pixel Densities
    atitit.提升软件开发效率大的总结O5
    Android Binder总结
    Enable Notepad++ 666 support both SCLEX_FORTRAN and SCLEX_F77
    client怎样调用IBinder接口对象
    文件系统损耗平衡算法
    u-boot支持yaffs映像烧写的补丁
  • 原文地址:https://www.cnblogs.com/Src-z/p/14224196.html
Copyright © 2020-2023  润新知