粉丝3086获赞1.4万

嗯,那在 spring 的这个 aop 里面会用到一个动态代理的技术,对吧?嗯,对。那这个动态代理的技术的话,在 spring 里面它是一个怎么的一个选择的一个策略呢?这个选择的策略就是在这个动态代理技术,它首先在 spring 里面它会使用到就是 jdk 动态代理 和这和那个就是 cc 内部动态代理,那么他选择了一个最基本的这个依据的话,肯定也就是那个 jdk 动态代理和 cd 内部他们之间的一个区别。那么比如说 我们的这个类,比方说他是八路的,他八路的话,那么 cc 内部肯定就是不能使用,应该是 spring 五点几之后啊,应该是默认是,就是在不配置的情况下,应该默认是走,就是 cc 内部。如果说 我们的这个背带里的泪,他实现的就是他有实现的接口,就他实现的接口,那么应该会使用 gdk 动态代理,然后其他的我就,我就站着说不出来, ok。

spring aop 他是在哪里创建的动态代理? spring aop 的这个动态代理他是在底层的哪个地方实现的?那这个 aop 的动态代理呢?他在两个地方等于创建一个地方呢?就是在病的生命周期的这个初始化之后, 会通过病的后置处理器的这个 host process after english leaders 创建 aop 的动态代理。当然这个你不需要记,这么你不需要完全说我把这些方法都记住,没有必要,对吧?你只需要记住它在病的生命周期的初始化之后,会通过病的后置处理器来进行创建 aop 的动态代理。 我们来看一下,好吧,关注无评,我通过代码呢给你们来看一下。对了,本视频的文档我已经整理好了,并且与往期内容一起汇总成了二零二三年最新家管面试文档,放在了视频的最后面,坚持看完一定对你有帮助。来找到这个病的后置处理器的这个接口, 那么我们可以看到呀,这个是初始化之前会调用的,这个呢,是初始化之后,那么他其实就是在初始化之后去调用的这个方法。我们来点一他的实线,那么你们觉得是哪一个实线类去创建的这个动态代理啊? 知名实意对不对?你看第二个就知道,肯定是这个,对吧?抽象的动态代理创建者,我们点进来, ok, 他在这里呢,会调用一个 whopper if necessary, 也就是说呢,如果有必要就给你创建东东代理。什么是有必要呢?也就是说呢,他会根据你配置的这个切点表达式来进行匹配,如果匹配上了呢, 他这里就会返回一个是否创建中代理,那么如果是要需要创建的话,他就会走这个衣服里面, 也就说呢,他在这个方法当中呢,会进行切点表达式的匹配,好吧,当然这个要用链也非常的深,我就不带着同学们具体的去看了。然后呢,如果切点表达式匹配上了,他就会走这个衣服里面,然后呢执行这个 crit proxy, 然后呢再执行下面的这个 ai 的 proxy, 我们来看一下,你看啊,他在这里呢就会有两个创建 l p 动态代理的实现类,一个呢 c 级 lab l p proxy, 一个呢 j d k dynamic 动态代理的 l p proxy, 所以说从这里我们就可以看出来,对吧?他会将他就会根据你的对应的一个实现呢进行动态代理的实现,那么我们可以看一下 g d k, 那么在这里呢,就会看到我们熟知的 j d k 的动态代理的一个创建,对不对?所以说呢, 它第一个地方就是在病的生命周期初始化之后,通过病的后置处理器的这个 post off 的 indishalization 方法创建 aop 的动态代理,好吧, 当然你要回到这个这个命题,你肯定要有一个前置的知识,你肯定要知道 i o c 当中的这个定的生命周期,对不对? 所以说我还是那句话,这些技术呢,都是连贯性的,并且 aop 呢,他也是依赖 ioc 的,所以说呢,你必须提前知道 ioc 相关的一些底层原理,如果你不知道的话,肯定也不知道我在这里说什么,对不对? 然后呢,还有一种特殊的情况,也就是在病的属性注入也是生命周期啊,病的生命周期属性注入这一步刚刚呢是在初始化,这一步不管是初始化还是属性注入都是属于生 命猪器当中的。那么还有一还有种情况呢,就是在属性猪入时呢,存在循环依赖的一个情况下,也会为循环依赖的病呢,通过病的后置处理器的另外一个实现,创建我们的 aop 的动态带领。 那么如果你不知道什么是循环依赖的话,去看一下徐树老师之前讲的这个循环依赖的面试题,好吧,那么循环依赖我们可以结合这个图看一下,在属性注入这个时候呢,他会去调用 属性注入,我看一下啊,他会在这里啊,他会在实力化之后,他会在实力化之后给他呢存到这个三期缓存当中,知道吧?但是他在这里不会立即调用啊,因为三期缓存他存的是一个函数接口,存的是函数的指针,他不会立马去调用这个方。 那么是在哪里调用的呢?是在属性注入发生了循环依赖这个过程当中去调用的,所以说他虽然是在这里去 去呈现的这个代码好吧,但是他并不会在这里调用,真正的调用呢,是在属性诸如属性副值出现了循环依赖才会进行调用。 ok, 好的,我们可以看一下, 我们呢,依然是依然看一下刚刚所说的 刚刚所说的这个动态代理的这个并的后置处理器按键动态代理的这个实现,它里面呢,同样的就也实现了这个 get alibing reference, 我们可以看一下这个方法, 这里面呢,我们可以看一下他是不是又 调用了这个 wop 衣服 necessary 啊,对不对?那么这里是不是又跟我们刚刚看的代码一样的,首先呢会匹配切点,然后呢匹配上了创建中的代理, 是一个方法呀,好吧,刚刚我们看的是哪个?是这个对不对?所以说呢,他会在这里先判断一下,你是不是在循环依赖的过程当中呢?是不是已经创建好了动物代理,如果在循环依赖当中创建了,那么我就不在这个初始化这里去创建了。 ok, 所以说呢,他这里已经做了判断,不需要担心两个地方都会创建好吧,所以说呢, 使命的 aop 呢,他会在两个地方进行创建,当然他不会同时创建啊,而是二选一,怎么呢?又是正常的病,好吧,正常的病会在病的生命中进了初始化之后去创建,然后呢 还有一种特殊情况就是循环依赖的病会在会在属性注入的时候呢进行创建, ok, nice。

今天威哥给大家说说 spring a o p 在什么场景下会失效。我们知道 spring a o p 是基于甲坝的动态代理实现的,所以说甲坝的动态代理不能工作的场景, spring a o p 就一定会失效。 当然了,除了动态代理不能工作的场景外,还可能会存在一些其他场景,会导致 spring aop 不能工作。 spring aop 常见的失效场景如下, 一、当前类没有被 spring 容器所管理 spring 中的 aop 是在并创建的初始化后阶段进行的,如果当前类没有被 spring 容器所管理,那么它的 spring aop 功能就肯定会失效。二、同一个类中方法的调用接下来让我们看一段代码片段,首先在配置类中开启 aop 的功能。 二、配置切面为由着 service 的 test 方法和 test 二两个方法设置前置通知,接下来在由着 service 的 test 的方法中调用 test 二、方法,这种调用属于 this 调用,并未使用到游子 service 的代理对象,所以 a o p 未生效。 如果我们想要实现在一个方法中调用同一个 ladle 的其他方法,那么有没有解决方案呢?当然有,我们只需要注入当前类即可,这样就可以使用代理对象调用了。 三、内部类方法的调用该方式会直接调用内部类实力对象的方法,同样没有使用到代理对象,所以 a o p 会失效。 四、私有方法私有方法代理对象是无法调用的,所以 a o p 会失效。 五、 static 修饰的方法因为 static 修饰的方法属于类对象,而不属于对象实力,所以无法被代理对象所。 六、烦恼修车的方法因为被烦恼修车的方法是无法被重写的,所以代理对象也是无法调用的。小伙伴们,关注威哥,更多精品内容持续与你分享!

springlp 的两种动态代理方式? jdk 动态代理通过反射实现一个代理接口的匿名类,主要是通过 proxy 和 invok 先看到的事情,针对实现了接口的内生成代理,当并实现接口时, spring 会采用 jdk 的动态代理 cgl 不同的代理通过先把增强技术动态的创建代理对象,如果目标对象没有实现接口, supreme 会采用 cglf 的代理。每日一问, supremelp 有哪些应用场景。

你好,我是程序员雪球,今天我们了解代理模式的原理,静态代理和动态代理的区别, spring aop 和动态代理的关系,代理模式的使用场景 以及用 java 实现一个动态代理。视力。一、代理模式的原理代理模式是一种设计模式, 他提供了一种通过引入一个代理对象来控制对原始对象的访问的方式。代理对象在客户端和原始对象之间充当中间人,他可以在调用原始对象的方法之前或之后执行额外的操作,如日志记录、缓存、权限检查等。 在代理模式中有三个主要角色,一、抽象主题 subject 定义了原始对象和代理对象的公共接口,包含了原始对象的所有方 法。二、具体主题 concrete subject 实现了抽象主题接口,是实际的业务逻辑对象。三、代理 proxy 实现了抽象主题接口, 他只有一个具体主题对象的引用,并在调用具体主题的方法时可以添加额外的逻辑。代理对象通常通过组合或继承的方式来实现对原始对象的包装。在调用代理对象的方法时,他会将请求转发给原始对象, 并可以在调用前后执行自定义的逻辑。二、静态代理和动态代理的区别静态代理是在编译时创建的代理类,他通过继承原始对象的类或实现其接口,并在其中重写需要代理的方法来实现。静态代理在运行时会生成一个新 类,因此它的性能可能会受到一定的影响。动态代理是在运行时动态创建的代理类,它通过使用反射机制在运行时生成代理对象的字解码,并将其加载到 jvm 中。 动态代理通常使用 java 的反射 a p, i 和动态字解码生成技术来实现,如 java the proxy 类或 clip cool。 动态代理的优点是不需要在编译时生成代理类,因此可以更加灵活的处理各种代理需求。三、 spring a o p 和动态代理的关系 spring aop aspect oriented programming 面向方面,编程是 spring 框架提供的一种强大的横切关注点技术,他基于动态代理实现。通过 spring aop, 我们可以在不修改原始代码的情况下 将横切关注点如日志记录、事务管理、权限检查等编织到业务逻辑代码中。 spring aop 使用了动态代理来创建代理对象,并在调用原始对象的方法时自动执行横切逻辑。 spring aop 支持两种类型的动态代理, 基于 jdk 的动态代理和基于 clip 的动态代理。基于 jdk 的动态代理要求被代理的对象必须实现至少一个接口,而基于 clip 的动态代理则不需要接口。 在 spring a o p 中,我们可以通过配置 x m l 文件或使用注解来定义切入点 point cup 和横切逻辑 advice。 spring 会在运行时根据切入点和横切逻辑自动创建代理对象,并将其注入到应用的上下文中。四、代理模式的使用场景 代理模式在以下场景中非常有用,一、远程调用 rpc 在分布式系统中,代理对象可以作为远程服务的本地代表,将远程方法调用转换为本地调用, 并处理网络通信和序列化等细节。二、缓存通过使用代理对象,可以在调用原始对象的方法之前或之后检查缓存中是否已经存在结果,并返回缓存中的结果,已提高系统性能。三、权限检查 代理对象可以在调用原始对象的方法之前进行权限检查,只有具备足够权限的用户才能访问受保护的资源。四、日志记录通过代理对象,可以在调用原始对象的方法之前或之后记录日 信息,以便跟踪和审计系统的操作。五、事务管理代理对象可以在调用原始对象的方法之前开始事务,在方法成功执行后提交事务, 或者在发生异常时回滚事物,以保证数据的一致性。总结,我们来总结一下今天学习的内容。 一、代理模式的原理代理模式是一种设计模式,他提供了一种通过引入一个代理对象来控制对原始对象的访问的方式。二、静态代理与动态代理的区别静态代理是在编译时创建的代理类, 他通过继承原始对象的类或实现其接口,并在其中重写需要代理的方法来实现。动态代理是在运行时动态创建的代理类,他通过使用反射击 制在运行时生成代理对象的字解码,并将其加载到 jvm 中。三、使用场景一、远程调用二、缓存三、记录日志四、事务管理五、权限检查 希望这个视力能帮助你理解代理模式的原理和使用场景。如果你有任何其他问题,请随时提问。


springboot 为什么要将 cg 赖补作为默认动态代理实现?我了个去,在签面的前置通知当中居然无法获取被代理方法上面的这个徐述注解。我们可以看到,我被代理的方法上面有一个徐述注解, 但是我在前置通知当中获取不到,这是为何呢?哈喽,大家好,我是徐树,我们一起来看一下这个问题。这条短视频的文档我已经整理好了,并且与往期内容一起汇总,放在了视频的最后面,坚持看完一定对你有关。首先我们可以看到使用 jk 动物代理,我们代理的对象呢,是一个接口对吧? 我们可以看一下这个目标方法,他当前指向的是 i user service, 它是一个接口,那么接口上面我们可以看到他明显是没有注解的,所以是获取不到当前被代理方法的注解的。这就是为什么 分布的他要将 cg lab 作为 l p 的动态代理的实现,你偏偏要将它改成 j d k 的动态代理。那么我们把这个配置去掉,将 c g lab 作为动态代理实现看一下, 我们可以看到现在这个注解呢,就正常的获取到了,因为 cg lab 他代理的对象呢,是实现类的 get user, 这个方法上面肯定是有注解的,所以不要再问我为什么 supreme 不得要将 cg lab 作为 aop 动态代理的原因了。首先第一点,我们在通知单中可以获取到实际类的方法,这对于我们去做一些业务处理是更有帮助的。另外呢, 假如说我们要将这个被代理的病注入进来,那么如果你使用 jdk 动物代理,必须要用接口来接受,那么 你使用 cgib, 你是可以使用实现类或者接口任意来接收的,可以避免一些类型转换的错误。所以不要再问我为什么 sprimble 的要使用 cgib 作为他的默认动物代理实现了。最后,对了,要获取注解,还有另外一种方式, 我们可以直接将注解声明在参数上面,然后在切点表达式上面直接写上你的参数的名字。那么这样呢,我们可以直接获取到这个注解的信息,无需通过获取被代理的目标方法。 但是呢,在我们实际开发当中,有可能我们要获取的这个注解并不一定就是切点表达式上面的这个注解,有可能我们在这个方法上面有一个乱, 而我们要在通知当中获取到的这个注解呢,并没有在切点表达式上面,所以我们还是得通过之前的这种方式来进行获取。那如果你使用 jdk 动态代理的话 就获取不到。好,那原因我们就分析到这里,并且 spring 不的为什么要将 c g life 作为它动弹里默认实现呢?原因也非常的明显了,好吧。

有假发,我自信今天的问题是 jdk 动态代理和 cg lit 动态代理的区别。有这么一个面试题, 用的 aop 使用的是 jdk 动态代理还是 cg leave 动态代理,那么我们先来看看他们有什么区别。 jdk 动态代理是基于接口的,比如这是接口,这是实现类,也就是目标类。那么 jdk 的动态代理就是产生一个新的对象,实现了接口,内部包裹了一个目标对象。但是如果目标类有自己独 有的方法,比如目标类有一把九八 k, 那么代理对象是无法代理九八 k 的,而 cg leave 的动态代理是基于借 成的,比如这是目标类, cg lip 会生成一个死类,这个死类就代理了目标类。如果目标类有一把九八 k, 那么子类一会有一把代理的九八 k。 我们继续说 spring 的 aop 采用的是哪种代理方式, spring 默认情况下会判断目标有没 没有实现接口,如果有就使用 jdk, 如果没有就使用 cg link。 当然我们可以通过设置强制要求 spring 采用 cg link 代理。关注假发,每天学习奇怪的知识!

动态代理有四种实现方案,那下面我们看一下用 cd 代步如何实现动态代理?那我们打开代码,首先我们有一个接口,这个接口里边呢有两个方法,这两个方法没有实现, 那么接下来我们有一个实线类,这个实线类的实现这个接口,然后覆盖这个接口里面的两个方法 好。然后第三个类呢,就是我们的一个 target properties 这个类,这个类呢它实现一个 measured intercept 这个接口, 那么这个接口呢,是我们 c g 内部里面提供的一个接口,我们可以看一下这个包导入是 c g 内部。好,那么这个类里面呢,首先第一个方法就是一个 get perforce 这个方法,那么这个方法呢,就是用来拿到一个呢代理论代 理对象通过这个方法里面传一个 class, 这个 class 呢可以是传个接口,也可以是传一个,真正的这个实现类都是可以的。那么 cg 内部它既支持对接口的动态代理,又支持对普通类的一个动态代理。 那么这里面这个方法的实现呢,就是基本上固定的这几行代码,我们有一个增强类,然后给增强类里面呢,你可以设置一个副类, 那么设置副类的话,表示你是基于这个对普通类的动态代理,那么你也可以设置一个接口,那表示你对接口的一个动态代理。 好,下面设置一个回调,回调是这一时,就是当前这个类,为什么是这一时呢?因为当前我们这个类啊,我们是实现了这个接口的,那么实现这个 接口,这个接口里面是有个方法的,我们到时要回掉这个接口里面,这个方法好,那就是它设置 this。 好,然后通过这个可以的创建就拿到了一个代理对象。 好,那么这个方法就看完了,然后下面这个方法就是呢他的一套 sopl 拦截方法,这个拦截方法到时会被调用好,在这个方法里边我们可以对目标类的 功能进行一个扩展和增强,比如说这行代码是调用目标类的方法,那么前面和后边呢,是我们自己扩展的这个功能, 所以他可以对我们目标方法进行拦截,然后在这个基础上进行功能的扩展和增强。好,那么这个类就 写完了。那接下来第三个呢,就是我们去测试啊,测试首先另一个我们这个啊,他给的 purpose 这个类,然后呢通过他来 get 到这个 purpose 这个方法,让传一个接口。 好,那么现在传个接口的话,表示我们对接口进行动的代理好,拿了这个代理对象,然后调接口的 say hello 和 say sunk 是两个方法。先找一片代码,看一下他有没有错误,或者他是是否可以成功运行,那么这个是他报错了,他说没有这个方法 好,那是因为呢?我们在获取动态代理对象的时候,我们这个地方设置接口,设置接口,那下面我们这个实现啊,南极的时候,南极的时候我们在这地方调用目标啊接口的一个方法的时候, 我们这个接口没有实现,所以这个时候我们不能这样调,我们要对接口进行代理的话,那这个时候呢,我们是没有时间类,对吧?那么这个时候我们需要自己手动实现一下。 好,那就说你在这里面去实现那个接口。好,那就是我们在这里可以写上我们的逻辑,比如说我去实现,我们去实现啊。好,我们虽然随便写个一一啊,简单一点,写一一,那么这地方我们返回个绕就行了。好,这表示我们自己去实现那个接口的这个方法。 好,那我们跑一下,那么现在他就可以运营成功了。 好,这是可以跑的,那么这是,呃,这个方法执行之前,方法执行之后,中间是那个接口的一个实现,那么这个接口实现是我们自己实实现的啊。好,这是这种方式 用接口啊,对接口的代理,那另外一种方式就是我们对一个普通类的代理,那就是对我们的时间类代理,比如说我们时间类,那么这个手边传一个来 mpl, 这个时间内传进来,然后我们就需要在这个类里面呢,我们要改一下,这地方就不是设置接口了,要设置一个呢,他的负类 相对是继承他这个类啊,然后对他进行拦截,好,设置副类。好,那么这个改好之后呢,我们下面这个拦截方法里面,就是我们不需要自己去实现了,因为他的实现类他是自己有实现的,他这个普通类他有实现,那么直接掉那个类就行了 啊,然后在前面进行增强,在后面进行增强。好,那么这个他的结果我们在淋水吞一下,对吧?好,那么代码写好了,我们这个是跑一下,那么这个是对我们的一个内的一个增强,不是接口,这个是是内。 好,跑一下,这是我们的方法,之前方法之后,这是目标方法的执行 啊。之前之后目标方法执行。好,这是我们 cg 内部实现动态代理,它既可以对接口进行动态代理,又可以对我们的普通的类进行动态代理。


英俊潇洒,气宇轩昂,才貌双全,没错,说的就是你,不仅如此,你还有个漂亮的女朋友,对你还特别的贴心,每次你外出前都会给你挑选一套干净帅气的衣服,在代码中就是这个样子, 看着没有什么特别的地方,接着女朋友对你更好了,在你出去之前又帮你挑选了一双干净的鞋子,那么在代码中就要加上干净鞋子的逻辑。会发现女朋友帮你挑选衣服和鞋子的逻辑和外出工作逻辑是两个独立的功能, 当加上挑选干净鞋子代码时,实际上是在外出方法里面改的,其实也就是在修改外出方法的逻辑了,这违背了开闭原则,如果以后女朋友再给你弄个帅气的发型, 那在代码中不就又得修改了吗?所以要把这两个功能分开,彼此不影响,而这就用到了代理功能,代理分为静态代理和动态代理。首先来看静态代理,在外出方法里把女朋友帮你挑选衣服和鞋子的逻辑去掉, 接着要有一个 boy purpose 类来做代理,实现 person 接口,里面有一个 person 类型的成员属性,再有个构造方法来把 person 类型对象传入进去,也就是 boy 对 象。接着就是实现 go out 的 方法, 在这里调用原有 person 类型对象的方法,而在这之上就可以加上女朋友帮你挑选衣服和鞋子的逻辑了。 接着来调用一下,创建出 boss 对 象,再创建出 boss 代理对象,把 boss 传入进去,得到代理对象后,直接调用 go out 方法。为了方便你梳理,我把所有的代码结构拿过来看一下输出结果,这样就把挑选衣服和外出给分离开了, 其实它是有致命问题的,就像功能简单的机器人一样,太死板了,不够灵活。比如说在代码中再多个方法外出工作, 那么在代理对象报 a p p 上也要多个外出工作的方法,那要是有外出吃饭,外出出差、外出打球,每个方法都要加一遍,这也太不灵活了。 不要忘了除了静态代理,还有动态代理了,所以动态代理就要登场了。动态代理有两种,分为 zdk 和 cdlive。 首先是 zdk, zdk 要求被代理的对象必须实现接口,因为 boy 已经实现了 person 接口,所以没问题方法里就只有外出相关的输出了。 接着创建一个 zdk handler 类,实现一个重要的接口 inokson handler, 就 靠它才能实现。 zdk 动态代理这里的成员属性,这是要被代理的目标对象,再弄个构造器,把目标对象传入进去。 接着就是要实现 inokson handler 中的 inok 方法了,第一个参数是调用该方法的代理时历,第二个参数是目标对象的方法参数。 方法中的 master 的 点 in work 就是 执行被代理对象中原本的方法了,在这执行之前就可以加上女朋友给你挑选衣服和鞋子的逻辑了。 到这里代理增强的执行就已经搞定了,但我们需要得到这个代理对象才能够执行。所以再来一个得到代理对象的方法, 里面调用 purpose, 点 new purpose, instance 方法参数分别是实现了 instance handler 接口对象的类加载器,也就是当前对象的类加载器,目标被代理对象的接口实现了 instance handler 接口的对象也就是当前对象, 然后写个 man 方法来调用就可以了。先把暴力对象创建出来,再创建出 zdk handler 代理对象,把暴力对象传入进去, 调用 get property 得到代理后的对象,这里要转成 person 接口类型,接着就可以执行方法了。我再把整个代码拿过来看一下调用后的结果,到这里 zdk 的 代理就结束了,你也能看出来他的缺点 就是被代理的对象必须要实现接口才可以,这不就有局限性了吗?如果原本业务不需要接口,为了代理还得特意弄一个接口出来,这有点不爽啊。所以不要忘了我们还有另一个动态代理 cdlive, 看看他是什么样子, 也是要有个被代理的对象 boy, 这里就不用有 person 接口了。接着创建一个类叫 cdlive interceptor, 同样也要实现一个重要的接口 master interceptor, 靠它实现 cdlive 动态代理。这里的成员属性就是要被代理的目标对象,再弄个构造器把目标对象传入进去。接着就是要必须实现 master interceptor 中的 intercept 方法了。 第一个参数是由 cdlive 动态生成的代理对象,第二个参数是目标对象的方法,第三个参数是目标对象的方法参数,第四个参数是生成的代理类对方法的代理。引用 方法中的 masterpurpose 点 enwork, 就是 执行被代理对象中原本的方法了,在这执行之前,可以加上女朋友给你挑选衣服和鞋子的逻辑, 到这里代理增强的执行就已经搞定了,但是我们还是需要得到这个代理对象才能够执行。所以再来一个得到代理对象的方法, 创建一个 insert 对 象,接着设置副类类型,就是要被代理的对象类型,设置拦截器,回掉对象为本身。最后调用可瑞特就可以生成代理对象了。再写个慢方法来调用,先把包类对象创建出来, 再创建出 c g lab intercept 代理对象,把报应对象传入进去,调用 get privacy, 得到代理后的对象 转换为报应类型,这时得到的就是代理对象了,就可以执行方法了。我再把整个代码拿过来,让你更好地梳理 c g lab 整个代码结构。我们看一下调用后的结果。到这里就可以来总结一波,先是静态代理, 要求每一个被代理的类都需要有一个对应的代理增强类,确定的时机是在变异时,如果要添加新的方法,只能手动再添加代理,不够灵活。 接着就是动态代理,首先是 zdk 方式,通过实现 user case and handler 接口来得到代理类,要求被代理的类必须实现接口才可以。然后是 cdlive 方式,通过实现 master intercepter 接口得到代理类,被代理的类可以没有接口, 它是通过继承类来创建出子类的方式。到这里你应该对静态代理和动态代理的理解更加深刻了。那么在下期和你详细介绍 spring 的 a o p 功能以及它是如何利用动态代理来实现的,关注阿星,和你分享更多硬核干货。