CGLib动态代理的底层原理

CGLIB(Code Generation Library)详解 什么是CGLIB CGLIB是一个强大的、高性能的代码生成库。其被广泛应用于AOP框架(Spring、dynaop)中,用以提供方法拦截操作。Hibernate作为一个比较受欢迎的ORM框架,同样使用CGLIB来代理单端(多对一和一对一)关联(延迟提取集合使用的另一种机制)。CGLIB作为一个开源项目,其代码托管在github,地址为:https://github.com/cglib/cglib为什么 阅读详情
  • JDK实现动态代理需要实现类通过接口定义业务方法。
  • CGLib采用了非常底层的字节码技术,其原理是通过目标类的字节码为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑。
  • 底层使用字节码处理框架ASM,来转换字节码并生成新的类。
  • 更详细一点说,代理类将目标类作为自己的父类并为其中的每个非final委托方法创建两个方法:
    • 一个是与目标方法签名相同的方法,它在方法中会通过super调用目标方法;
    • 另一个是代理类独有的方法,称之为Callback回调方法,它会判断这个方法是否绑定了拦截器(实现了MethodInterceptor接口的对象),若存在则将调用intercept方法对目标方法进行代理,也就是在前后加上一些增强逻辑。intercept中就会调用上面介绍的签名相同的方法。

这里写图片描述

一、使用CGLib创建代理类

(1)引入CGLib依赖

这里写图片描述

(1)目标类

public class HelloServiceImpl {  
 public void say(){  
  System.out.println("hello everyone");  
 }  
} 

(2)生成方法拦截器

这里写图片描述

(3)生成代理对象

这里写图片描述

这里Enhancer类是CGLib中的一个字节码增强器,它可以方便的对目标类进行扩展。

  • 首先将目标类HelloServiceImpl设置成父类;
  • 然后设置拦截器HelloMethodInterceptor;
  • 最后执行enhancer.create()动态生成一个代理类,并从Object强制转型成父类型HelloServiceImpl;
  • 最后,在代理类上调用方法。

二、对不同方法执行不同的回调逻辑

2.1 JDK动态代理的方式

在JDK动态代理中,通过InvocationHandler接口方法的调用对代理类内的所以方法都有效。我们往往需要对Method的Name进行判断,然后针对不同的Method编写不同的逻辑,如下:

class MyInvocationHandler implements InvocationHandler {
   //具体的调用类
    Object target;

    public MyInvocationHandler(Object obj) {
        target = obj;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //当前所持有的proxy对象
        //method表示当前别调用的方法
        //args表示方法中传递的参数
        System.out.println("method name:"+method.getName());
        if(method.getName().equals("add")){
            if(args[0].equals("apple")){
                return false;
            }
        }
        return method.invoke(target, args);
    }
}

2.2 CGLib的方式

首先介绍两个概念:

  • 回调数组Callback[]:不同的Method的调用可以对应不同的回调函数。在动态代理中,回调函数就是拦截器需要执行的函数,所以我们说回调函数,可以约等于拦截器。拦截器通过实现MethodInterceptor接口定义。
  • 回调过滤器CallbackFilter:int accept(Method method) 返回的值为数字代表了Callback数组中的索引位置,即Method对应的Callback。

(1)定义实现过滤器CallbackFilter接口的类:

import java.lang.reflect.Method;   
import net.sf.cglib.proxy.CallbackFilter;  

public class TargetMethodCallbackFilter implements CallbackFilter {  

    /** 
     * 过滤方法 
     * 返回的值为数字,代表了Callback数组中的索引位置,要到用的Callback 
     */  
    @Override  
    public int accept(Method method) {  
        if(method.getName().equals("method1")){  
            System.out.println("filter method1 ==0");  
            return 0;  
        }  
        if(method.getName().equals("method2")){  
            System.out.println("filter method2 ==1");  
            return 1;  
        }  
        if(method.getName().equals("method3")){  
            System.out.println("filter method3 ==2");  
            return 2;  
        }  
        return 0;  
    }  
}  

(2)为代理类设置回调数组和回调过滤器:

import net.sf.cglib.proxy.Callback;  
import net.sf.cglib.proxy.CallbackFilter;  
import net.sf.cglib.proxy.Enhancer;  
import net.sf.cglib.proxy.NoOp;  

public class TestCglib {  
    public static void main(String args[]) {  
        Enhancer enhancer =new Enhancer();  
        enhancer.setSuperclass(TargetObject.class);  
        CallbackFilter callbackFilter = new TargetMethodCallbackFilter();  

        /** 
         * (1)callback1:方法拦截器 
           (2)NoOp.INSTANCE:这个NoOp表示no operator,即什么操作也不做,代理类直接调用被代理的方法不进行拦截。 
           (3)FixedValue:表示锁定方法返回值,无论被代理类的方法返回什么值,回调方法都返回固定值。 
         */  
        Callback noopCb=NoOp.INSTANCE;  
        Callback callback1=new TargetInterceptor();  
        Callback fixedValue=new TargetResultFixed();  
        Callback[] cbarray=new Callback[]{callback1,noopCb,fixedValue};  
        //enhancer.setCallback(new TargetInterceptor());  
        enhancer.setCallbacks(cbarray);  
        enhancer.setCallbackFilter(callbackFilter);  
        TargetObject targetObject2=(TargetObject)enhancer.create();  
        System.out.println(targetObject2);  
        System.out.println(targetObject2.method1("mmm1"));  
        System.out.println(targetObject2.method2(100));  
        System.out.println(targetObject2.method3(100));  
        System.out.println(targetObject2.method3(200));  
    }  
}  
import net.sf.cglib.proxy.FixedValue;  

public class TargetResultFixed implements FixedValue{  
    /**  
     * 该类实现FixedValue接口,同时锁定回调值为999  
     * (整型,CallbackFilter中定义的使用FixedValue型回调的方法为getConcreteMethodFixedValue,该方法返回值为整型)。  
     */  
    @Override  
    public Object loadObject() throws Exception {  
        System.out.println("锁定结果");  
        Object obj = 999;  
        return obj;  
    }  
}  

cglib底层源码分析(⼆) 其实我们如果看到了cglib所⽣成的代理类之后,其实就不难猜测,cglib是如何去⽣成代理类了,我们看 ⼀个完整的代理类: 我们发现,UserService代理类既继承了UserService类,也实现了Factory接⼝,从⽽代理中就需要去 实现Factory接⼝中的⼏个⽅法: 我们可以发现newInstance()⽅法会重新⽣成⼀个代理对象,setCallbacks()和getCallbacks()可以⽤来 设置或获取增强逻辑。 我们还发现,不仅只... 阅读详情

相关推荐

深入理解动态代理:JDK动态代理与CGLIB动态代理

动态代理是一种在运行时创建代理对象的技术,通过代理对象来控制对原对象的访问,能够在不修改原对象的情况下添加额外的功能。JDK动态代理:基于Java反射机制,只能代理实现了接口的类。CGLIB动态代理:基于字节码生成技术,可以代理没有实现接口的类。// 抽象主题接口动态代理在Java中提供了一种灵活而强大的机制,能够在运行时为目标对象添加额外的功能。JDK动态代理和CGLIB动态代理各有优势和适用场景,开发者可以根据具体需求选择合适的代理机制。希望这篇文章对你理解动态代理有所帮助。

捕风捉你 · 星桥API接入与大模型实战 3152

【深度思考】聊聊CGLIB动态代理原理

聊聊CGLIB动态代理原理。

申城异乡人 2790

JDK与CGLIB动态代理原理及底层实现深度解析

动态代理作为Java反射机制与设计模式结合的典范,广泛应用于AOP编程、事务管理、日志记录、权限控制等场景。其核心思想是在运行时动态生成代理对象,从而在不修改目标类源码的前提下,实现对方法调用的拦截与增强。相较于静态代理,动态代理具有更高的灵活性和扩展性,支持运行时织入逻辑,有效实现关注点分离。典型应用如Spring的声明式事务管理,通过动态代理在方法执行前后自动开启和提交事务;MyBatis则利用JDK动态代理将Mapper接口转化为可执行的SQL操作实例。

weixin_35677363的博客 449

CGLIB动态代理底层实现原理

一、前言 最近在探究Spring AOP的性能,发现最后是绕不开JDK动态代理和CGLIB动态代理这两个点。笔者心里大致有这么个概念:对于动态代理来说,CGLIB性能要好于JDK。也知道CGLIB是利用ASM技术基于继承子类实现动态代理,JDK是基于实现接口实现动态代理,但是对于底层实现还是比较模糊。今天就彻底整明白CGLIB动态代理的底层实现。二、前置准备(一)测试代码CGLIB核心的几个概念...

wajueji的博客 935

泛微E8流程监控指南:如何用SQL实时追踪审批节点状态?

本文详细介绍了如何利用SQL实时监控泛微E8系统中的审批流程状态,包括核心数据表结构解析、全链路监控SQL实战以及智能预警机制设计。通过数据库直接查询和状态关联分析,帮助企业快速定位卡顿节点,提升流程效率。适用于需要优化OA系统流程管理的企业IT人员和业务主管。

weixin_30687051的博客 437

几率大的Redis面试题(含答案)

本文的面试题如下: Redis 持久化机制 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题 热点数据和冷数据是什么 Memcache与Redis的区别都有哪些? 单线程的redis为什么这么快 redis的数据类型,以及每种数据类型的使用场景,Redis 内部结构 redis的过期策略以及内存淘汰机制【~】 Redis 为什么是单线程的,优点 如何解决redis的并发竞争key问题 Red...

睶 38万+

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

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

m0_65277261的博客 3709

不止于使能:用汇川PLC功能块封装,实现伺服轴状态管理与安全逻辑

本文深入探讨了汇川PLC功能块封装在伺服轴控中的应用,详细介绍了如何通过高级封装技术实现伺服轴的状态管理与安全逻辑。文章涵盖了从基础使能到全生命周期监控的进化,多轴协同的实例化管理策略,以及安全逻辑的防御性编程技巧,为工业自动化领域的工程师提供了实用的解决方案和最佳实践。

weixin_28684825的博客 271

Cglib动态代理的底层原理

使用 老规矩,先回忆一下怎么使用cglib的动态代理 写一个方法拦截器作为回调 创建Enhancer并设置父类和回调 使用Enhancer创建代理类 public class MyMethodInterceptor implements MethodInterceptor { @Override public Object intercept(Object o, Method ...

Mutou_ren的博客 798

Surface Go 2 变身 Linux 开发本:保姆级 Ubuntu 20.04 双系统安装与驱动配置全攻略

本文详细介绍了如何将 Surface Go 2 变身为高效的 Linux 开发本,涵盖 Ubuntu 20.04 双系统安装、专用内核配置、驱动优化等全流程。通过 linux-surface 内核安装和硬件驱动优化,确保 Surface Go 2 的触控、笔输入、摄像头等功能完美运行,适合开发者打造便携生产力工具。

weixin_30596165的博客 616

基于simulink 的不间断电源ups的项目实例

UPS系统的核心组件包括整流器、逆变器、电池管理系统和控制系统。- **Three-Phase Controlled Rectifier**:设置触发角为0度,用于控制整流器的输出电压。- **Three-Phase Inverter**:设置逆变器的输出频率为60Hz,用于将直流电转换为交流电。- **Control System**:编写MATLAB函数,用于监测市电状态并控制各模块的工作模式。- **Step**:设置阶跃时间,例如0.05秒,阶跃前后的值分别为0和1,用于模拟市电中断。

xiaoheshang_123的博客 711

Java JDK 与 CGLIB 动态代理底层原理与实战应用

Java动态代理是运行期动态生成代理类的技术,分为JDK原生动态代理(基于接口)和CGLIB动态代理(基于继承)。JDK代理要求目标类实现接口,通过InvocationHandler拦截方法;CGLIB可代理普通类,通过MethodInterceptor实现方法增强。二者在Spring AOP、RPC框架等场景广泛应用,JDK代理轻量但需接口,CGLIB更灵活但无法代理final类/方法。动态代理实现了业务与增强逻辑的解耦,是高级框架设计的核心基础。

xiaoye220911的博客 611

SAP ABAP 获取采购订单未清数量/在途库存的 6 种方式

这篇文章我总结了获取采购订单未清数量/在途库存的 6 种方式,每种方式的优劣势和适用场景有所不同。读者请结合自身需要选择。

SAP李斌,本人承诺所有原创文章均不使用任何AI生成技术,请大家放心阅读。 2661

CGLib动态代理底层原理

必要条件spring的jar包 目标对象 package dynamic.cglib; public class MainBiz { public void run(){ System.out.println("MainBiz---->run()"); } } CGLib动态代理 package dynamic.cglib; import org.s...

weixin_43343423的博客 430

创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—ISP图像处理开发案例

创龙科技研发的 TL3588-EVM 评估板具备强大视频处理能力,可满足多场景视频开发需求。为助力开发者快速上手,本文整理 7 个实用视频开发案例,涵盖从采集到显示的全流程,详细说明各案例的硬件连接、参数配置与代码解析,帮助开发者高效实现评估板视频相关功能开发与调试。

创龙,嵌入式一体化解决方案商 208

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

SpringAOP的CGLIB动态代理的底层原理实现

欢迎加入java学习讨论群:725562382 CGLIB动态代理: CGLIB(Code Generation Library)是一个开源项目!是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。 Hibernate支持它来实现PO(Persistent Object 持久化对象)字节码的动态生成 Hibernate生成持久化类的javassis...

ywl470812087的博客 11万+

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

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

Spring AOP底层实现原理深度剖析:动态代理与CGLIB的终极对决

在Spring框架的优雅封装之下,AOP(面向切面编程)技术如同一位无形的舞者,轻盈地在核心业务逻辑间穿梭,实现了解耦与增强的双重艺术。而其舞步的核心秘密,正是。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 992

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

AOP底层原理之动态代理(JDK+CGLIB)

什么是代理? 举个栗子:经纪人–>明星 律师–>委托人 房产中介–>卖方或买方 总结:代理拥有我们本身角色的属性与方法,我们需要做的一些工作,可以交由他们去完成,因为他们可以跟我们完成同样的事情。 什么时候我们会用到代理? 一件我们没时间做但是又不得不做的事情;一件我们想做但是又不能去做的事情。就可以交由给代理去做。 翻译到代码中的意思就是:我想要调用一个类的方法,但是我自己本身不能去调用或者是受到限制,就可以交由代理去调用。 什么又是动态代理? 代理只能在他自己擅长的方向上进行处理事务,

下雨打伞干嘛的博客 474

【Spring AOP】AOP 底层实现原理 —— 动态代理类的创建(JDK、CGlib)、工厂如何加工原始对象

AOP编程AOP 编程AOP 概念AOP 编程的开发步骤切面的名词解释AOP 的底层实现原理动态代理类的创建JDK 的动态代理(原理 + 编码)CGlib 的动态代理 更多内容请查看笔记目录:【Spring 5.x】学习笔记汇总 AOP 编程 AOP 概念 POP (Producer Oriented Programing) 面向过程(方法、函数)编程 —— C 以过程为基本单位的程序开发,通过过程间的彼此协同,相互调用,完成程序的构建。 OOP (Object Oritened Programin

萌宅鹿的技术小屋 3228

Spring AOP底层实现原理,使用jdk动态代理以及cglib动态代理

Aop底层使用动态代理实现:有两种情况动态代理 第一种:有接口情况,使用jdk动态代理 第二种:没有接口情况,使用cglib动态代理

qq_45830276的博客 1531

JDK 动态代理 vs CGLIB:原理、区别与 Spring AOP 底层揭秘

JDK 动态代理适用于接口基础的架构,是现代微服务架构中的常见选择CGLIB 动态代理适用于类级别的代理,特别是在需要代理非接口方法时表现优异Spring 默认策略已能应对大多场景,特殊情况下可通过配置指定代理方式性能考量在现代 JVM 中两者差距已不明显,架构设计应更关注代码结构与可维护性理解这两种代理机制的差异与适用场景,能够帮助开发者在 Spring 生态中更加游刃有余地实现切面编程,构建高可维护性的系统架构。

2501_93078354的博客 912

Spring原理学习(七)JDK动态代理与CGLIB代理底层实现

编译器也能修改 class 实现增强编译器增强能突破代理仅能通过方法重写增强的限制:可以对构造方法、静态方法等实现增强为什么有这么麻烦的一套东西呢?避免反射,提高性能,代价是一个代理类配两个 FastClass 类,代理类中还得增加仅调用 super 的一堆方法用编号处理方法对应关系比较省内存,另外,最初获得方法顺序是不确定,这个过程没法固定死与JDK动态代理相比,CGLIB代理类数目相对较少,只有两个类。而JDK动态代理在调用到第十七次后会生成代理类去优化为非反射调用,并且是一个方法对应一个代理类。

小鲁蛋的博客 1896

【Spring】AOP的底层原理-JDK动态代理和CGlib动态代理

简单来说,使用反射和字节码,在运行期间创建指定接口或类的子类以及它的实例对象的一种技术。

m0_46628950的博客 381

JDK动态代理和cglib动态代理(AOP的底层实现原理)

一、代理设计模式 代理类和委托类具有相同的接口。代理类的对象本身并不真正实现服务,而是通过委托类的对象的相关方法来提供特定的服务。 二、静态代理 见《大话设计模式》第7章 缺点: 一个代理类只能应用于一个接口的实现类,如果有多个接口的话就要定义很多实现类和代理类才行。而且,如果代理类对业务方法的预处理、调用后操作都是一样的(比如:调用前输出提示、调用后自动关闭连接),则多个代理类就会有很...

g1607058603的专栏 1053

CGLIB动态代理和JDK动态代理-Spring AOP的底层实现原理

简述: AOP是目前Spring框架中的核心之一,在应用中具有非常重要的作用,也是Spring其他组件的基础。它是一种面向切面编程的思想。关于AOP的基础知识,相信多数童鞋都已经了如指掌,我们就略过这部分,来讲解下AOP的核心功能的底层实现机制:如何用动态代理来实现切面拦截。         AOP的拦截功能是由java中的动态代理来实现的。说白了,就是在目标类的基础上增加切面逻辑,生

mrchen的博客 949
上一篇: TCP与UDP的区别
下一篇: 数据库索引总结
奋起直追CDS
博客等级 码龄11年 57粉丝 94原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值