• Cglib代理


    目标对象:
    package com.bj.daili;
    
    public class UserServiceImpl {
    
        public final void saveUser(String username, String password) {
            System.out.println("保存用户【"+username+"】,密码是【"+password+"】");
        }
    
        public void updateUser(String username, String password) {
            System.out.println("更新用户【"+username+"】,密码是【"+password+"】");
        }
    
        public void deleteUser(String username) {
            System.out.println("删除用户【"+username+"】");
        }
    
        public String findUser() {
            System.out.println("查询用户,返回王老五");
            return "王老五";
        }
    
        
    }
    
    
    代理对象:
    package com.bj.daili;
    
    import java.lang.reflect.Method;
    
    import org.springframework.cglib.core.Signature;
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    
    public class CglibProxy implements MethodInterceptor {
        
        //定义一个目标对象
        Object targetObject;
    
        public Object createProxyObject(Object targetObject) {
            this.targetObject = targetObject;
            //如何根据目标对象创建的cglib的代理对象呢?
            
            Enhancer enhancer = new Enhancer();
            enhancer.setClassLoader(this.targetObject.getClass().getClassLoader());
            enhancer.setSuperclass(this.targetObject.getClass());
            enhancer.setCallback(this);
            //创建cglib代理
            return enhancer.create();
        }
        
        /**
         * intercept:在访问目标对象之前先执行代理对象
         *   * Object proxy:代理对象
         *   * Method method:代理对象中执行的方法(目标的对象的方法对象)
         *   * Object[] args:方法中的参数
         *   * MethodProxy:方法的代理对象
         *   * 返回值Ojbect:可以指定目标对象方法的放回值
         * */
        @Override
        public Object intercept(Object proxy, Method method, Object[] args,MethodProxy methodProxy) throws Throwable {
            if(method.getName()!=null && method.getName().contains("save") || method.getName().contains("update")){
                security();//执行校验
                System.out.println("代理对象的类:"+proxy.getClass());
                System.out.println("代理对象或目标对象的方法名称:"+method.getName());
                if(args!=null && args.length>0){
                    for(Object o:args){
                        System.out.println("调用目标对象的方法参数:"+o);
                    }
                }
            }
            //获取目标对象方法信息
            Signature signature = methodProxy.getSignature();
            System.out.println(signature.getName()+"   "+signature.getArgumentTypes()+"   "+signature.getReturnType());
            /**
             * method.invoke:调用目标对象
             * 参数一:目标对象
             * 参数二:调用目标对象的方法参数
             * 返回Object:调用目标对象的方法的返回值
             */
            Object o = method.invoke(targetObject, args);
            //如果返回null,客户端调用目标对象之后就都为null
            return o;
        }
    
        
        //校验
        public void security(){
            System.out.println("开始执行校验...。校验结束");
        }
    
        
    
    }
      测试:
    package com.bj.daili;
    
    public class App {
    
        public static void main(String[] args) {
            CglibProxy cglibProxy = new CglibProxy();
            //使用createProxyObject的方法,传递目标对象,返回代理对象
            UserServiceImpl userService = (UserServiceImpl) cglibProxy.createProxyObject(new UserServiceImpl());
        
            userService.saveUser("李小四", "123");
            userService.updateUser("李小四", "123");
            userService.deleteUser("李小四");
            String value = userService.findUser();
            System.out.println("value:"+value);
        }
    }
  • 相关阅读:
    Python编程-数据库
    Django框架之自定义分页
    Python编程-多线程
    Python编程-多进程二
    慕课学习--OSI与TCP/IP网络协议
    VMwaretools、共享文件夹、全屏
    Linux--慕课学习
    随想
    Linux--初次体验
    正则表达式——初次尝试
  • 原文地址:https://www.cnblogs.com/baijin05/p/5054171.html
Copyright © 2020-2023  润新知