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

    既然叫动态代理,那肯定会有静态代理,这里不再详细介绍什么是动态代理

    下面,主要讲解动态代理的原理

    在接触Spring时,经常能碰到AOP和IOC两个概念,IOC就是依赖注入,AOP的原理的就是动态代理。

    首先我们申明一个Target的接口,为其声明一个方法:

    public interface Interceptor {
    
        public void intercept();
    }

    接着,定义一个Log类和Transaction类来实现这个接口:

    public class LogInterceptor implements Interceptor{
    
        @Override
        public void intercept(){
            System.out.println("日志记录开始");
        }
    }
    public class TransactionInterceptor implements Interceptor {
    
        @Override
        public void intercept() {
            System.out.println("事务开启");
        }
    }

    下面,定义一个动态代理类,必须实现InvocationHandler 这个接口:

    public class TargetProxy implements InvocationHandler{
    
        private Target target;
        private Stack<Interceptor> interceptorStack;
         
        public TargetProxy(Target target, Stack<Interceptor> interceptorStack) {
            this.target = target;
            this.interceptorStack = interceptorStack;
        }
     
        @Override
        public Object invoke(Object proxy, Method method, Object[] args)
                throws Throwable {
            System.out.println("invoke");
            for(Interceptor interceptor:interceptorStack){
                interceptor.intercept();
            }
            return method.invoke(target, args);
        }
    }

    最后是我们的测试类:

    public class Test {
    
        public static void main(String[] args) {
            Stack<Interceptor> interceptorStack =new Stack<>();
            interceptorStack.add(new LogInterceptor());
            interceptorStack.add(new TransactionInterceptor());
             
            Target target = new TargetImpl();
            target = (Target) Proxy.newProxyInstance(target.getClass().getClassLoader(),
                            target.getClass().getInterfaces(),new TargetProxy(target, interceptorStack));
            System.out.println("Start Target");
            target.execute();
        }
        
    }
  • 相关阅读:
    PLC 输入输出接线示意图
    光耦的使用
    windows server 2008R2 搭建FTP服务器的步骤:
    C# semaphore的使用
    Multisim模拟 达灵顿管,防反接电路,恒流源电路
    一些芯片资料
    220V交流转5V直流电路详细
    STM32中的模拟IIC使用
    基于C8T6的DA14580蓝牙方案
    基本元件实验:继电器
  • 原文地址:https://www.cnblogs.com/zyxiaohuihui/p/9163930.html
Copyright © 2011-2022 走看看