Spring面向切面编程(AOP)原理二之使用Cglib实现动态代理

Spring AOP的两种动态代理方式的原理和实现(JDK和CGLIB) 代理机制 Spring 的AOP 部分使用使用JDK动态代理,部分使用CGLIB来为目标对象创建代理。如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理;如果目标对象没有实现任何接口,则会创建CGLIB动态代理。CGLIB是第三方包,从Spring4.3开始就无需再次导入包了。 注意 客户端直接调用与目标类相对应的代理类的功能,为了保证代理类与目标类具有相同功能,代理类与目标类必须实现相同的接口 代理是实现AOP的核心和关键技术。只要是AOP,就一定会涉及代理技术 . 代理技术的分类 按照是否 阅读详情

上面我们已经介绍了使用JDK实现动态代理的过程

Spring面向切面编程(AOP)原理一之使用JDK实现动态代理

除了可以使用JDK实现动态代理之外,还可以使用Cglib实现动态代理。

在Spring框架内部的AOP(面向切面编程)就是会自动切换JDK和Cglib实现动态代理。

上面已经介绍了JDK使用条件是必须要有接口,但是Cglib就没有这个条件。

Cglib是第三方平台的,所以使用之前需要导入jar包,在Sping核心jar包里面已经导入了Cglib的jar包。

在这里插入图片描述

下面介绍使用Cglib实现动态代理的过程

创建一个类(需要被代理的)

public class UserDao {
    public void save(){
        System.out.println("保存操作");
    }
    public void delete(){
        System.out.println("删除操作");
    }
}

代理过程

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

//使用cglib实现动态代理,不需要有接口
public class UserDaoCglibProxy implements MethodInterceptor {

    //提供创建代理对象的方法,核心就是创建的代理对象是原本对象的子类
    public UserDao createCglibProxy(UserDao userdao){

        //1.创建核心类
        Enhancer enhancer = new Enhancer();
        //2.设置父类,表明继承关系,设置完成就会自动的创建好了子类
        enhancer.setSuperclass(userdao.getClass());
        //3.方法回调,以实现MethodInterceptor接口的方式回调
        enhancer.setCallback(this);
        //4.拿到子类,就是代理对象
        UserDao user = (UserDao)enhancer.create();

        return user;
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects,
                            MethodProxy methodProxy) throws Throwable {

        /*//调用父类方法之前,添加额外功能,实现动态代理
        check();*/

        //筛选某个方法动态代理
        if("save".equals(method.getName())){
            check();
        }

        //让子类调用父类的方法
        Object invokeSuper = methodProxy.invokeSuper(o, objects);
        return invokeSuper;
    }

    //定义需要被增强(代理)的方法
    public void check(){
        System.out.println("保存之前进行校验");
    }
}

编写测试类

import org.junit.Test;

public class UserDaoTest {

    UserDao userDao = new UserDao();
    UserDaoCglibProxy userDaoCglibProxy = new UserDaoCglibProxy();

    @Test
    public void Test(){
        UserDao cglibProxy = userDaoCglibProxy.createCglibProxy(userDao);
        cglibProxy.delete();
        cglibProxy.save();
    }
}

运行结果

删除操作
保存之前进行校验
保存操作

Process finished with exit code 0

可以看到已经实现了对save()方法实现了增强,这就是动态代理的过程。

使用Cglib动态代理的原理就是,创建原本类的子类,这个子类就是代理对象,然后子类可以调用父类的方法,也可以有自己的方法(也就是实现了方法的增强)。

使用Cglib动态代理的过程,已经在代码里面做了详细的步骤注释,可以对照理解。

但是在Spring框架中,使用AOP并不需要写出动态代理的过程,因为Spring框架已经对动态代理的过程进行了封装,所以只需要在配置文件里面配置一些必要的参数即可,这里的两篇介绍主要是为了理解AOP动态代理其中的原理、过程,加深理解学习。

使用cglib实现aop切面编程 我最近在写一个简易的java web框架,其中包括ioc,mvc,aop,dao等基本功能,这几天把aop这块弄得差不多了,所以在这里总结一下。 项目详细信息:coin-framework spring中核心的概念就是ioc和aop。aop面向切面编程听起来很厉害,所以今天我们用cglib动态代理来实现一个简单的aop。 首先我们模仿一下spring的aop中基于注解的切面编程。 @Asp... 阅读详情

相关推荐

细说Spring——AOP详解(使用CGLIB实现AOP)

一、动态代理实现AOP的缺陷 在上一篇文章细说Spring——AOP详解(动态代理实现AOP)中讲解了如何使用动态代理实现AOP,虽然Java动态代理为我们提供了非常灵活的代理机制,但Java动态代理是基于接口的,如果目标对象没有实现接口我们该如何代理呢?这时候我们就需要使用CGLIB来实现AOP了。 二、CGLIB实现代理的原理 我们先创建一个目标对象 package demo1; ...

啦啦啦的博客 2855

Spring5学习随笔-AOP底层实现(JDK、CGlib)、实现切面(@Aspect)

主要涵盖了Java的Spring框架中AOP(Aspect Oriented Programming)编程的概念和底层实现原理。在AOP编程中,切面是基本单位,由切入点和额外功能组成。与面向对象编程(OOP)和面向过程编程(POP)相比,AOP通过代理类为原始类增加额外功能,有利于原始类的维护。学习笔记中还介绍了AOP编程的开发步骤和底层实现原理,包括JDK动态代理和CGlib动态代理的创建方式,以及Spring工厂如何加工创建代理对象。此外,学习笔记还介绍了基于注解的AOP编程的开发步骤和细节,包括切入点

rookies99的博客 344

【Spring Boot实战与进阶】AOP的两种动态代理(JDK和Cglib)

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

2301_79055239的博客 1767

【手写 Spring 框架 AOP 篇】一、基于 JDK、CGlib 实现 AOP 切面

这个系列是基于小傅哥的「手撸 Spring」学习的一个记录 目标 AOP 意为面向切面编程,通过预编译的方式和运行期间动态代理实现程序功能的统一维护。这句话可能不太好理解,可以先看下图: 从图中可以看出, AOP 的作用就是在对某些具有共同特点的方法进行拦截,并执行方法拦截器中的功能,完成对原有方法的功能的扩展。 这一次首先是要实现一个简单的切面功能。 设计 首先从代理一个方法,来观察代理方法的过程。 public void test_proxy_method() { Object t.

qq_37393071的博客 969

Spring 中 AOP 的实现原理——动态代理

原文地址 https://www.cnblogs.com/tuyang1129/p/12878549.html Spring AOP 的实现原理 Spring的AOP实现原理其实很简单,就是通过动态代理实现的。如果我们为Spring的某个bean配置了切面,那么Spring在创建这个bean的时候,实际上创建的是这个bean的一个代理对象,我们后续对bean中方法的调用,实际上调用的是代理类重写的代理方法。而Spring的AOP使用了两种动态代理,分别是 JDK 的动态代理,以及 CGLib 的动态代理。

蔡定努 3607

互联网金融项目实战(大数据Hadoop hive)

什么是互联网金融? 互联网金融 --> 信贷(信用贷款) --> 支付宝率先搞了一个信用体系 互联网金融: 在线支付、P2P 银行: 只会锦上添画、不喜欢雪中送炭 银行害怕出现坏账 ( 储户存钱,银行放贷 赚个利息差 ) 银行是可以倒闭的 保险公司不允许倒闭 银行分为:商业银行(自生自灭的)和非商业银行(国家的) 中国工商银行 全球第一大行 招商银行(清朝的一个李鸿章) 中国银行(历史超过 100 年了) 国家政策:希望银行能够扶持中小型企业 p2p:网络借贷平台 民间吸纳贷款 -->

weixin_58276266的博客 1549

Spring 面向切面编程 第4关:AOP实现原理-CgLib动态代理

Spring 面向切面编程 第4关:AOP实现原理-CgLib动态代理

于建章的博客 3063

cadence capture CIS 之添加数据库

2021-08-20 cadence capture CIS 之添加数据库准备一、添加数据源 准备 1、数据库文件(*.mdb) 2、电脑上安装好 cadence 软件 一、添加数据源 打开“ ODBC数据源管理器” ( 路径:C:\Windows\SysWOW64\odbcad32.exe ) ...

weixin_42256550的博客 6041

JDK动态代理、Cglib动态代理及Spring AOP

Java中的JDK动态代理是一种通过反射机制生成代理对象的技术,使得我们能够在运行时动态地创建某个接口的代理类,而无需手动编写实现类。JDK动态代理通常用于横切关注点(如日志、事务管理、安全性等)在方法调用前后进行处理,而不需要修改目标类的源代码。

意疏的博客 6381

【鸿蒙南向开发】OpenHarmony音频驱动audio适配方案

这份鸿蒙(HarmonyOS NEXT)文档包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony南向开发、鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS_666的博客 4507

Transformer模型在语义通信中的实战应用:从信源编码到端到端优化

本文深入探讨了Transformer模型在语义通信中的实战应用,从信源编码到端到端优化。文章分析了Transformer凭借其强大的全局依赖建模能力,如何成为实现高效语义提取与传输的理想架构,并提供了构建可端到端训练系统的具体实现思路与评估方法,旨在为下一代智能通信系统提供技术参考。

o9p0q1的博客 686

动态代理之 cglib 实现

(尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/87513102冷血之心的博客) 目录 前言: 正文: AOP(面向切面编程) JDK动态代理 cglib实现动态代理 cglib包结构: cglib动态代理相关的基础类: cglib动态代理Demo 总结: 前言:         这篇文...

冷血之心的博客 9282

实现单芯片2400bps 音频编解码方案

终于按照朋友的需求,帮他开发了一款单芯片集音频采集编码传送并接收解码播放功能的方案,交给快递公司邮寄给远在郑州的他.整个项目从开始定型到现在一个样机送出,整整花了1个月时间,感觉挺有成就感,挺有意思,工作是辛苦的,结果却是快乐的.现在将这中快乐的的心情与大家分享一下.    真个项目用一颗主控搞定,ARM9的,200KBytes 片内RAM,主频可以跑到300MHz,64pin LQFP封装

nyxsec的专栏 3677

Spring 框架之 AOP 原理剖析

前言 AOP(Aspect Oriented Programming)面向切面编程是 Spring 框架最核心的组件之一,它通过对程序结构的另一种考虑,补充了 OOP(Object-Oriented Programming)面向对象编程。在 OOP 中模块化的关键单元是类,而在 AOP 中,模块化单元是切面。也就是说 AOP 关注的不再是类,而是一系列类里面需要共同能力的行为。 本文内容主要包括:...

CSDN 官方博客 6588

不加行也能填满:用 ABAP BDC 驯服 Table Control 滚动录制缺陷,批量维护供应商银行账户

摘要 本文探讨了在SAP ECC/S4HANA系统中处理供应商主数据时,Table Control控件带来的批量导入挑战。文章指出,银行账户维护界面中Table Control的滚动动作难以被录制工具捕捉,导致批量导入数据时仅能填充前5行。解决方案是通过BDC_OKCODE显式触发翻页(如=P+),并配合行号拼接(如(01)~(05))将数据写入不可见行。文中提供了完整的ABAP程序示例,展示了如何读取外部文件、动态生成BDCDATA、处理表格翻页逻辑,最终通过CALL TRANSACTION执行XK01事

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 256

在Qt中集成VTK和PCL:实现数据可视化的完整指南

在现代软件开发中,数据可视化至关重要。将VTK(Visualization Toolkit)和PCL(Point Cloud Library)集成到Qt环境里,能为开发者提供强大的可视化解决方案。本文将深入讲解如何在Qt中读取PCL文件,展示VTK模型和PCL数据,适合想要在Qt项目中实现数据可视化的开发者。

轩宇的博客 911

【动态代理】CGLIB 动态代理的使用及原理

JDK 的中动态代理类位于 java.lang.reflect 包下,一般主要涉及到以下两个类:

sco5282的博客 1万+

YOLO11训练中的过拟合识别与应对策略:讲解过拟合的表现、原因及应对方法(如数据增强、正则化、DropOut)

摘要 本文深入探讨了YOLO11目标检测模型中的过拟合问题。首先解析了过拟合的本质,即模型在训练数据上表现优异但泛化能力差的现象,并通过误差分解公式解释了其数学原理。文章详细列举了YOLO11中过拟合的具体表现,包括训练与验证指标分化、检测性能不一致性、置信度分布异常和类别检测不均衡等问题,并提供了对应的可视化诊断方法。 在原因分析部分,重点阐述了模型复杂度与数据规模不匹配、训练数据质量与分布问题以及训练策略不当三大根本原因。特别对比了YOLO11不同版本(n/s/m/l/x)的参数量和推荐最小数据量,指出

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 238

Spring AOP动态代理的实现方式

"JDK"动态代理和"CGLIB"动态代理 JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类 CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那...

小驴 1万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析

本文深入解析Spring AOP的核心实现技术——JDK动态代理与CGLib动态代理。首先从AOP的概念入手,阐述其解决代码复用痛点的原理,并详细介绍了切面、通知、切入点等核心概念。然后重点剖析JDK动态代理的实现机制,包括InvocationHandler接口和Proxy类的关键作用,通过日志代理的实战案例演示了代理对象的创建过程。文章还对比了两种代理方式的适用场景,帮助开发者理解Spring AOP的整体执行流程和技术选型依据。全文兼顾理论与实战,为掌握Spring AOP提供了全面的技术指南。

CodeSuc 的技术博客 2836

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

AOP的实现原理 —— 静态代理 和 动态代理( Spring AOP)

这里的AOP指的是面向切面编程思想,而不是Spring AOP 。 AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理、日志、缓存等等。 AOP实现主要分为 静态代理 和 动态代理 。 - 静态代理 主要是 `AspectJ` - 动态代理 主要是 `Spring AOP`

猎人在吃肉 1万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

【SSM - Spring篇04】AOP面向切面编程 - 代理模式 - jdbc动态代理 -CGLIB动态代理

AOP概念   AOP采取横向抽取机制,即将分散在各个方法中的重复代码提取出来,然后在程序编译或运行阶段,再将这些抽取出来的代码应用到需要执行的地方(一般用于日志记录、性能统计、安全控制、事务处理、异常处理等操作) AOP术语 切面   切面(Aspect)是指封装横切到系统功能(如事务处理)的类。 连接点   连接点(Joinpoint)是指程序运行中的一些时间点,如方法的调用或异常的抛出。 切入点   切入点(Pointcut)是指那些需要处理的连接点。在Spring AOP 中,所有的方法执行都是

Java小皮孩 7693

【Spring】Spring AOP底层原理:JDK动态代理和CGLIB动态代理

Spring AOP 的实现原理是基于动态代理和字节码操作的。而动态代理是基于反射机制的。 在编译时, Spring 会使用 AspectJ 编译器将切面代码编译成字节码文件。在运行时, Spring 会使用 Java 动态代理或 CGLIB 代理生成代理类,这些代理类会在目标对象方法执行前后插入切面代码,从而实现AOP的功能。

m0_65277261的博客 3707

Spring AOP实现原理(动态代理 vs CGLib)

是一种编程思想,允许你在不修改原有代码的情况下,动态地给某些方法添加额外功能(如日志、事务、权限控制等)。精确定位需要增强的方法,如:“所有Service层的public方法”Pointcut切点。触发invoke()

m0_60697978的博客 1135

Java面试-Spring AOP 的实现原理:动态代理(JDK Proxy 与 CGLIB)

本文深入解析了Spring AOP的实现原理,重点对比了JDK动态代理和CGLIB动态代理两种实现方式。JDK动态代理基于接口实现,通过InvocationHandler拦截方法调用;CGLIB则通过继承目标类生成子类代理。文章详细分析了两种代理的优缺点:JDK代理性能较好但需接口支持,CGLIB可代理无接口类但性能略低。同时提供了手写实现代码示例,并总结了Spring选择代理方式的策略。最后还包含AOP执行流程、常见面试题和避坑指南,帮助开发者全面掌握Spring AOP的核心机制。

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

Spring框架之AOP动态代理底层实现原理

本文摘要: 本章介绍了AOP的基础实现,重点讲解了JDK动态代理在Spring中的应用。内容包括: AOP概念与实现方式对比:Spring AOP采用动态代理,而AspectJ基于编译期增强 JDK动态代理核心机制:通过Proxy.newProxyInstance创建代理对象,InvocationHandler实现方法增强 示例代码展示:演示了如何创建代理对象并实现前置/后置增强逻辑 Spring的扩展实现:介绍了ReflectiveMethodInvocation类,该类封装方法调用信息,为拦截器链式调用

几许的博客 1551
上一篇: Spring面向切面编程(AOP)原理一之使用JDK实现动态代理
下一篇: Spring面向切面编程(AOP)三之AOP的使用及XML配置
xiaoshijiu333
博客等级 码龄9年 102粉丝 176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值