首页 专题 文章 代码 归档
spring手动代理 - cglib代理
2020.01.26 11:52 2020.01.26 12:29

1. cglib字节码增强

  • cglib动态代理实现主要用户没有接口的方式,也即业务代码只有实现类。
  • 需要导入cglib框架,在运行时创建目标类的子类,从而对目标类实现增强。
  • 导入jar包:spring-core 包已整合该框架。

截图-1580009882

1.1. 目标类

package com.misiai.b_cglib;


public class UserServiceImpl {
    public void addUser() {
        System.out.println("Add User");
    }

    public void updateUser() {
        System.out.println("Update User");
    }

    public void deleteUser() {
        System.out.println("Delete User");
    }
}

1.2. 切面类

package com.misiai.b_cglib;

public class MyAspect {

    public void before() {
        System.out.println("前置方法2");
    }

    public void after() {
        System.out.println("后置方法2");
    }
}

1.3. 代理类

package com.misiai.b_cglib;

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class MyBeanFactory {

    public static UserServiceImpl createUser() {
        //1.目标类
        final UserServiceImpl userService = new UserServiceImpl();

        //2.切面类
        final MyAspect myAspect = new MyAspect();

        //3.1核心类
        Enhancer enhancer = new Enhancer();
        //3.2创建目标类的子类,要确定父类
        enhancer.setSuperclass(userService.getClass());

        /*

          3.3设置回调函数,此接口等价jdk中的 InvocationHandler
          参数1-3和之前的invoke一样,

         */

        enhancer.setCallback(new MethodInterceptor() {
            @Override
            public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {

                //前置
                myAspect.before();

                Object result = method.invoke(userService, objects);

                //后置
                myAspect.after();

                return result;
            }
        });

        //3.4创建代理
        UserServiceImpl proxyService = (UserServiceImpl) enhancer.create();

        return proxyService;
    }
}

1.4. 测试类

package com.misiai.b_cglib;

import org.junit.Test;

public class CGLIBTest {

    @Test
    public void test01() {
        UserServiceImpl userService = MyBeanFactory.createUser();
        userService.addUser();
        userService.updateUser();
        userService.deleteUser();
    }
}

2. jdk代理与cglib代理的区别

2.1.1. CGLib

截图-1580010580

2.1.2. JDK

截图-1580010638

Tips:这两点不同,可做为以后我们用来观察spring如何使用何种方式的依据。

本节阅读完毕! (分享
二维码图片 扫描关注我们哟