zoukankan      html  css  js  c++  java
  • Spring框架的AOP的底层实现之JDK的动态代理(代码了解,理解原理)

    1.创建接口UserDao:

    package com.huida.demo1;
    
    public interface UserDao {
    
        public void save();
        public void update();
    }

    2.创建实现接口的类UserDaoImpl:

    package com.huida.demo1;
    
    public class UserDaoImpl implements UserDao {
    
        @Override
        public void save() {
            System.out.println("保存用户...");
        }
    
        @Override
        public void update() {
            System.out.println("修改用户...");
        }
    
    }

    3.编写代理对象类:

    package com.huida.demo1;
    
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    
    /*
     * 传一个对象返回一个代理对象
     */
    public class MyProxyUtils {
    
        public static UserDao getProxy(UserDao dao){//这里传的参数为最大的接口,所以凡是它的子类均可传入,范围更大
            //使用proxy类生成代理对象
            /*
             * 参数:
             * loader:类加载器 dao.getClass().getClassLoader
             * interfaces:接口   子类对象获取它所实现的接口
             * h:回调函数
             */
            UserDao proxy=(UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(),new InvocationHandler() {
                
                //回调函数:代理对象一执行,invoke方法就会执行
                @Override
                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                    //System.out.println("aaaaaaaaaa");
                    //对功能进行增强
                    if("save".equals(method.getName())){
                        System.out.println("记录日志...");
                    }
                    return method.invoke(dao, args);
                }
            });
            //返回代理对象
            return proxy;
        }
    }

    4.编写测试代码:

    package com.huida.demo1;
    
    import org.junit.Test;
    
    public class demo1 {
    
        @Test
        public void run1(){
            UserDao dao=new UserDaoImpl();
            dao.save();
            dao.update();
            System.out.println("-------------------");
            //使用工具类获取代理对象
            UserDao proxy=MyProxyUtils.getProxy(dao);//MyProxyUtils是UserDao的一个子类
            //每调用一次接口里面的方法,就会一次回调代理对象中的方法
            proxy.save();
            proxy.update();
        }
    }

    5.单元测试run1方法,运行结果为:

    通过回调函数对函数功能进行了增强,在保存用户之前输出了“记录日志”。

  • 相关阅读:
    [小技巧]虚拟机服务管理小程序
    JNI学习
    Java读取Properties文件的七种方法
    UFLDL教程练习(exercise)答案(1)
    win7让库显示“我的电脑”
    关于asp.net中绑定的模版列CheckBox无法触发OnCheckedChanged事件的问题
    使用OLEDB读取不同版本Excel数据的连接字符串设置
    身为程序员,电脑的时间格式是不能随意设置的
    实现sqlserver数据根据不同时间周期分组
    常用Web Service汇总(天气预报、时刻表等)【转】
  • 原文地址:https://www.cnblogs.com/wyhluckdog/p/10130795.html
Copyright © 2011-2022 走看看