AOP底层实现:cglib动态代理

一.与JDK动态代理的区别:

jdk动态代理:基于接口,实现接口中相同的方法去实现的;
cglib动态代理:父子继承关系.原始类作为父类,代理类作为子类,这样也跟jdk一样保证了2者方法一致.同时在代理类中提供新的方法.

二.demo:

2.1 原始类:UserService

package com.baizhiedu.cglib;


/**
 * cglib动态代理的原始类
 */
public class UserService {

    public void login(){
        System.out.println("登录功能...");
    }

    public void register(){
        System.out.println("注册功能...");
    }

}

2.2 代理功能实现:

package com.baizhiedu.cglib;


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

import java.awt.*;
import java.lang.reflect.Method;

/**
 * cglib动态代理
 */
public class TestCglibProxy {

    public static void main(String[] args) {

        //1.创建原始类
        final UserService userService = new UserService();

        //2.创建代理类+额外功能
        Enhancer enhancer = new Enhancer();
        //借一个classLoader
        enhancer.setClassLoader(TestCglibProxy.class.getClassLoader());


        //3.创建静态累不累,提供额外功能+运行原始对象的方法----等同于InvocationHandler和里面的invoke方法
        MethodInterceptor methodInterceptor=new MethodInterceptor() {
            /**
             *
             * @param o  原始对象
             * @param method 原始方法
             * @param args 原始方法的参数
             * @param methodProxy 代理对象
             * @return
             * @throws Throwable
             */
            public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
                System.out.println("cglib额外功能...");
                //invoke参数1:表示method是属于哪个方法的? 很明显是属于userService的
                return method.invoke(userService, args);
            }
        };

        enhancer.setCallback(methodInterceptor);
        enhancer.setSuperclass(userService.getClass());
        UserService  userServiceProxy = (UserService ) enhancer.create();
        userServiceProxy.login();
        userServiceProxy.register();
    }

}

注意: cglib中的MethodInterceptor和spring中的MethodInterceptor不一样,这里是属于cglib包下的MethodInterceptor

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。