zoukankan      html  css  js  c++  java
  • CGLIB字节码增强

    package com.itheima.a_proxy.b_cglib;
    
    public class MyAspect {
        
        public void before(){
            System.out.println("鸡首2");
        }
        
        public void after(){
            System.out.println("牛后2");
        }
    
    }

     UserServiceImpl 

    package com.itheima.a_proxy.b_cglib;
    
    public class UserServiceImpl {
    
        public void addUser() {
            System.out.println("a_proxy.b_cglib addUser");
        }
    
        public void updateUser() {
            System.out.println("a_proxy.b_cglib updateUser");
    
        }
    
        public void deleteUser() {
    
            System.out.println("a_proxy.b_cglib deleteUser");
        }
    
    }
    package com.itheima.a_proxy.b_cglib;
    
    import java.lang.reflect.Method;
    
    import org.springframework.cglib.proxy.Enhancer;
    import org.springframework.cglib.proxy.MethodInterceptor;
    import org.springframework.cglib.proxy.MethodProxy;
    
    
    public class MyBeanFactory {
        
        public static UserServiceImpl createService(){
            //1 目标类
            final UserServiceImpl userService = new UserServiceImpl();
            //2切面类
            final MyAspect myAspect = new MyAspect();
            // 3.代理类 ,采用cglib,底层创建目标类的子类
            //3.1 核心类
            Enhancer enhancer = new Enhancer();
            //3.2 确定父类
            enhancer.setSuperclass(userService.getClass());
            /* 3.3 设置回调函数 , MethodInterceptor接口 等效 jdk InvocationHandler接口
             *     intercept() 等效 jdk  invoke()
             *         参数1、参数2、参数3:以invoke一样
             *         参数4:methodProxy 方法的代理
             *         
             * 
             */
            enhancer.setCallback(new MethodInterceptor(){
    
                @Override
                public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                    
                    //
                    myAspect.before();
                    
                    //执行目标类的方法
                    Object obj = method.invoke(userService, args);
                    // * 执行代理类的父类 ,执行目标类 (目标类和代理类 父子关系)
                    methodProxy.invokeSuper(proxy, args);
                    
                    //
                    myAspect.after();
                    
                    return obj;
                }
            });
            //3.4 创建代理
            UserServiceImpl proxService = (UserServiceImpl) enhancer.create();
            
            return proxService;
        }
    
    }

     test类

    package com.itheima.a_proxy.b_cglib;
    
    import org.junit.Test;
    
    public class TestCglib {
        
        @Test
        public void demo01(){
            UserServiceImpl userService = MyBeanFactory.createService();
            userService.addUser();
            userService.updateUser();
            userService.deleteUser();
        }
    
    }

  • 相关阅读:
    Java实现 蓝桥杯 算法提高 扶老奶奶过街
    Java实现 蓝桥杯 算法提高 扶老奶奶过街
    RichEdit选中文字右键菜单的实现
    避免用户重复点击按钮(使用Enable:=False,消息繁忙时会有堵塞的问题,只能改用Sleep)
    枚举当前系统用户(使用NetUserEnum API枚举)
    通过Graphics对象获取它所属的Control
    Delphi中动态调用TXMLDocument的经历
    MongoDB集群
    瀑布流特效
    常用优化策略
  • 原文地址:https://www.cnblogs.com/hudj/p/7059456.html
Copyright © 2011-2022 走看看