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();
        }
    
    }

  • 相关阅读:
    Sql server时间转时间long
    SQL Server死锁问题:事务(进程 ID x)与另一个进程被死锁在 锁 | 通信缓冲区资源上并且已被选作死锁牺牲品。请重新运行该事务。
    layui jquery ajax,url,type,async,dataType,data
    在 Postman 中报错:Self-signed SSL certificates are being blocked 的分析与解决
    SQL server CASE WHEN
    SQL server 统计分组经计
    Spring boot @Transactional
    基于mysql的sakila数据库脚本分析
    常用数据库JDBC
    在做银行支付接口案例的时候,遇到的编码问题!
  • 原文地址:https://www.cnblogs.com/hudj/p/7059456.html
Copyright © 2011-2022 走看看