zoukankan      html  css  js  c++  java
  • spring AOP 动态代理模式整理

    package util;
    
    public interface 被代理类接口 {
        public  void queryDataById(String Id);
        
        public void insertData();
        
    }
    package util;
    
    public class 被代理的类 implements 被代理类接口{
    
    
        @Override
        public void insertData() {
            // TODO Auto-generated method stub
            System.out.println("不管参数.反正插入数据了");
        }
    
        @Override
        public void queryDataById(String Id) {
            System.out.println("通过"+Id+"查出了数据");
        }
        
    }
    package util;
    
    public class 被代理的类2 implements 被代理类接口{
    
    
        @Override
        public void insertData() {
            // TODO Auto-generated method stub
            System.out.println("第二个
    类 ,不管参数.反正插入数据了");
        }
    
        @Override
        public void queryDataById(String Id) {
            System.out.println("这是第二个,,通过"+Id+"查出了数据");
        }
        
    }
    package util;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Proxy;
    
    /**
     * 
     * 这个不是动态代理类!!!!!
     * 主要返回代理类对象!!!!
     * 通过代理类对象调用被代理的对象
     * 
     * @author Steve
     *
     */
    //该类并不是代理类,只是将被代理类的对象传进这个类中,经过处理    返回代理类的对象
    public class 动态代理类 {
         private 被代理类接口 inter = null;
         //建个构造器,将被代理的对象传进来
    
        public 动态代理类(被代理类接口 inter) {
            super();
            this.inter = inter;
        }
        
        public Object getProxyObject () {
            //得到classLoader
            ClassLoader loader = inter.getClass().getClassLoader();
            //接口数组
            Class[] interfaces = {被代理类接口.class};
            //去创建一个能处理该接口的AOP处理器
            InvocationHandler h =  new 调用处理器(inter);
            //返回动态代理对象,在运行中,才知道代理哪个接口,调用哪个处理器
            return Proxy.newProxyInstance(loader, interfaces, h);
        }
    }     
    package util;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    //特定的处理器
    public class 调用处理器     implements InvocationHandler{
    
        //将被代理的对象传进来, 可以调用
        private Object target;
        
        public 调用处理器(Object target) {
            this.target = target;
        }
        
        
        //这个处理器的方法,传进来的几个参数,可以想象成已知的
        
        //proxy 是com.sun.proxy代理对象的引用.调用proxy 中的方法    不管什么方法传进来,通过动态都能使用前置和后置通知了
        
        //代理对象会根据传进来的类,动态的代理这个类
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("我在此处使用前置通知开始执行"+method.getName()+"了..........");
                Object result = method.invoke(target, args);
                System.out.println("我在此处织入后置通知"+method.getName()+"执行完了........");
                return result;
        }
    }
    package util;
    /**
     * 采用动态代理的方式实现AOP
     * @author 胡其阳
     *
     */
    public class Aop {
        public static void main(String[] args) {
            被代理类接口 b = new 被代理的类();
            被代理类接口 proxy = (被代理类接口) new 动态代理类(b).getProxyObject();
            
            proxy.queryDataById("1331");
            
            proxy.insertData();
            
            //System.out.println(proxy);
        }
    }

  • 相关阅读:
    spring-boot启动debug信息中non-fatal error解决
    spring-boot-sample-web-jsp
    How to configure spring boot through annotations in order to have something similar to <jsp-config> in web.xml?
    mybatis支持属性使用驼峰的命名
    No handler for type [text] declared on field [content]
    android自定义控件库
    Android 百分比布局库(percent-support-lib) 解析与扩展
    Android 高清加载巨图方案 拒绝压缩图片
    Android 热补丁动态修复框架小结
    AndroidAutoLayout 屏幕适配
  • 原文地址:https://www.cnblogs.com/stevehu1231/p/7966930.html
Copyright © 2011-2022 走看看