动态代理模式

动态代理模式

1.MyBatis动态代理实现无接口实现类操作数据库实现原理

首先创建一个UserService接口

public interface UserService {

    void saveUser();

    void findUser();
}

在创建回调处理器,这个回调处理器就是由创建出来的代理对象来进行调用

public class ProxyInvocationHandler implements InvocationHandler {

    //目标对象
    private Object target;

    public ProxyInvocationHandler(Object target){
        this.target = target;
    }

    /**
     * @param proxy 代理对象,这个参数是代理对象在调用invoke方法时将自身this传如回来
     * @param method 当前正在调用的目标对象的方法
     * @param args 当前正在调用的目标对象的方法参数
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object returnVal = null;
        //调用之前
        System.out.println("before...");
        //调用目标对象的方法
        returnVal = method.invoke(target, args);
        System.out.println("after...");
        return returnVal;
    }

写一个Main测试方法

public class Main {

    public static void main(String[] args) {
        //初始化回调处理器
        InvocationHandler handler = new ProxyInvocationHandler(new UserServiceImpl());
        //动态创建一个代理对象
        //第一个参数是一个类加载器,由于在运行时动态创建了一个字节码,那么就需要类加载器来进行装载
        //第二个参数是目标对象所实现的所有接口
        //第三个参数是回调处理器实例
        //注意:创建出来的代理对象已经实现了UserService接口,因此可以进行类型转换
        UserService proxy = (UserService) Proxy.newProxyInstance(UserService.class.getClassLoader(), UserServiceImpl.class.getInterfaces(), handler);
        proxy.findUser();
        proxy.saveUser();
    }
}
原文地址:https://www.cnblogs.com/ywbmaster/p/9794804.html