zoukankan      html  css  js  c++  java
  • spring 动态代理 原理

    动态代理可以在不修改被代理对象源码的情况下,为代理对象添加其他的逻辑功能,可以使用继承和组合两种方式实现,但是那样如果被代理对象很多的情况下实现是不太可能的。

    首先,新建一个类,实现InvocationHandler,在里面加上自己的逻辑

    public class LogInterceptor implements InvocationHandler {

    private Object target;//被代理对象
    
    public Object getTarget() {
    
       return target;
    
    }
    
    public void setTarget(Object target) {
    
       this.target = target;
    
    }
    
    private void beforeMethod(Method method){
    
       //自己添加的业务逻辑
    
       System.out.println(method.getName()+" start");
    
    }
    
    @Override
    
    public Object invoke(Object proxy, Method method, Object[] args)
    
           throws Throwable {
    
       beforeMethod(method);//先调用自己的逻辑
    
       method.invoke(target, args);//然后调用被代理对象的方法
    
       return null;
    
    }
    

    }

    测试类:

    @Test
    
    public void testProxy(){
    
       //首先新建一个被代理对象
    
       UserDAO userDAO = new UserDAOImpl();
    
       LogInterceptor interceptor = new LogInterceptor();
    
       //将被代理对象设置进去
    
       interceptor.setTarget(userDAO);
    
       //新建代理
    
       UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), interceptor);
    
       userDAOProxy.save(new User());
    
       userDAOProxy.delete();
    
    }
    

    控制台输出:

    save start
    user saved!
    delete start
    user deleted

    通过实验可以知道,这个userDAOProxy的类是$Proxy4,它实现了接口UserDAO,当它调用save(user)方法的时候,由于InvocationHandler的实现类interceptor已经传给它,在这个时候,它首先通过接口UserDAO取得其中的方法Method method = userDAO.getClass().getMethod(),然后调用自身的invoke()方法。

  • 相关阅读:
    nor flash之4字节地址模式
    DroidVim:在安卓手机上使用vim
    从linux命令行分享文件:bashupload.com和transfer.sh
    记一个实时Linux的中断线程化问题
    nor flash之写保护开销
    第七届开源操作系统会议(OS2ATC 2019)见闻及资料分享
    nor flash之擦除和写入
    PyCharm 远程调试代码
    【图像分析】形态学
    【强化学习】DQN 算法改进
  • 原文地址:https://www.cnblogs.com/lllini/p/11955358.html
Copyright © 2011-2022 走看看