美文网首页
AOP底层实现:cglib动态代理

AOP底层实现:cglib动态代理

作者: NisyCoding | 来源:发表于2020-06-11 13:36 被阅读0次

一.与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

相关文章

  • 3.3AOP简介-第3章aop面向切面编程

    AOP:面向切面编程,底层采用动态代理实现的,采用了两种代理:jdk的动态代理与CGLIB的动态代理。AOP是动态...

  • Spring AOP实现

    使用SpringBoot实现AOP动态代理 1 使用CGLIB实现AOP动态代理 .properties .xml

  • Spring AOP的实现原理--CGLIB动态代理

    Spring AOP的实现原理--CGLIB动态代理 CGLIB(Code Generation Library)...

  • 浅谈Java代理二:Cglib动态代理-MethodInterc

    CGLib动态代理特点:使用CGLib实现动态代理,完全不受代理类必须实现接口的限制,而且CGLib底层采用ASM...

  • Spring之使用XML配置Spring AOP

    1.aop的原理 Spring AOP底层主要使用了JDK动态代理和cglib动态代理。具体可看文章设计模式之代理...

  • springboot aop

    springboot怎样使用aop呢?我们知道aop的实现一种是jdk动态代理实现aop,一种是cglib动态代理...

  • AOP底层实现:cglib动态代理

    一.与JDK动态代理的区别: jdk动态代理:基于接口,实现接口中相同的方法去实现的;cglib动态代理:父子继承...

  • java动态代理

    目录: 简介 jdk动态代理 cglib动态代理 jdk动态代理与cglib的区别 应用spring的aop 简介...

  • 2018-09-16

    AOP的XML配置: AOP的先关术语: Spring底层的AOP实现原理 动态代理: JDK动态代理:只能对实现...

  • spring aop 汇总

    静态代理、动态代理和cglib代理 aop 使用 Spring AOP - 注解方式使用介绍spring aop ...

网友评论

      本文标题:AOP底层实现:cglib动态代理

      本文链接:https://www.haomeiwen.com/subject/cokbtktx.html