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

    动态代理模式

    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();
        }
    }
  • 相关阅读:
    第六章 编译并运行程序
    第五章 顺序型编程进阶
    第四章 异常
    第三章 顺序型编程
    TCP和UDP的区别和优缺点
    Java UDP Socket编程
    springboot 学习资源推荐
    springboot集成redis
    微信公众号的SpringBoot+Quartz的定时任务Demo
    远程桌面发生身份验证错误,要求的函数不受支持【WIN10家庭】或【专业版】--解决办法
  • 原文地址:https://www.cnblogs.com/ywbmaster/p/9794804.html
Copyright © 2011-2022 走看看