• 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()方法。

  • 相关阅读:
    Django
    闭包&装饰器
    Python学习 Day 062
    Python学习 Day 059
    Python学习 Day 058
    Python生成器
    第一类对象(函数),闭包及迭代器
    进阶函数的学习
    对函数的初步了解
    python文件操作
  • 原文地址:https://www.cnblogs.com/lllini/p/11955358.html
Copyright © 2020-2023  润新知