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方法,运行结果为:

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

原文地址:https://www.cnblogs.com/wyhluckdog/p/10130795.html