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

}

原文地址:https://www.cnblogs.com/hudj/p/7059456.html