springboot AOP学习笔记之代理模式基本理解 CGLIB动态代理

本文介绍了在SpringBoot中使用AOP时,针对未实现接口的类如何利用CGLIB进行动态代理。通过创建代理类继承原始类并重写方法进行增强操作,展示了CGLIB的工作原理。同时,文中提到了SpringBoot在选择JDK动态代理与CGLIB代理的策略。
摘要由CSDN通过智能技术生成

假若我们想要代理的对象并没有实现任何接口,这时候我们就要用到CGLIB动态代理了,这就是它与JDK动态代理主要不同的地方。
CGLIB代理的思想是通过继承来继承实例类的所有方法,然后将他们全都重写,再重写的同时进行增强操作,这就是它的主要思想,接下来通过代码来实现。
实例类RealFighter类:

package com.imooc.pattern;
public class RealFighter{
    public void kick(){
        System.out.println("ride kick!");
    }
    public void fist(){
        System.out.println("ride fist!");
    }
}

CglibProxy代理类:

package com.imooc.cglib;

import com.imooc.pattern.RealFighter;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class CglibFighterProxy implements MethodInterceptor {

    public RealFighter creat(Class<?> clazz){
        Enhancer enhancer=new Enhancer();
        //将被代理类ConcreteClassNoInterface设置成父类,
        enhancer.setSuperclass(RealFighter.class);
        //设置拦截器 回调对象为本身对象
        enhancer.setCallback(this);
        //执行enhancer.create()动态生成一个代理类,并从Object强制转型成父类型ConcreteClassNoInterface。
        return (RealFighter) enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //增强功能
        System.out.println("开始!");
        Object result = null;
        result =methodProxy.invokeSuper(o,objects);
        System.out.println("结束!");
        return result;
    }
}

这个类里包含了creat方法和intercept方法,cglib动态代理类要实现MethodInterceptor的接口,要重写intercept的方法,我们就要把增强的方法写在这里边;而creat方法则是帮我们创建一个增强后的对象,然后将这个对象返回。
再看看main函数怎么用:

public static void main(String[] args){
        //创建代理类
        CglibFighterProxy cglibFighterProxy =new CglibFighterProxy();
        //用RealFighter类来接收增强后的RealFighter
        RealFighter realFighter=cglibFighterProxy.creat(RealFighter.class);
        //执行
        realFighter.fist();
        realFighter.kick();
    }

结果:

开始!
ride fist!
结束!
开始!
ride kick!
结束!

以上演示中cglib通过继承RealFighter类获得其所有公开的方法,然后在intercept里写增强的方法(在出拳和出脚之前加上准备动作和在结束时加上结束动作),然后再使用反射机制运行原本的方法(出拳和出脚),这样完成不改写源代码就可以增强方法。

关于springboot对JDK动态代理和CGLIB动态代理的选择:
1.若实例类不实现任何接口则用CGLIB代理;
2.若开发者强行设置为使用CGLIB代理则会使用CGLIB代理;
3.若实例类实现了接口则默认用JDK代理;

若有不足,请指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值