大聪明助你拿Offer | 目标类实现了接口一定会走 JDK 动态代理吗?

前言

🍊作者简介: 不肯过江东丶,一个来自二线城市的程序员,致力于用“猥琐”办法解决繁琐问题,让复杂的问题变得通俗易懂。
🍊支持作者: 点赞👍、关注💖、留言💌~

“面试造火箭,入职拧螺丝?” 别慌!这里没有“茴香豆的茴有几种写法”,只有最实用、最高频、最能唬住面试官的 Java 面试题解析!
你是不是也经历过:

  • 🤯 背了一堆八股文,面试官一问就懵圈?
  • 😅 明明知道答案,却讲得支支吾吾?
  • 🚀 想进大厂,却连 HashMap 和 ArrayList 的区别都说不利索?

别怕!这就是你的“Java面试急救包”,大聪明专治各种答不上来😉

正文

💡每日一题:目标类实现了接口一定会走JDK动态代理吗?
💡难度系数: ⭐⭐

在上一篇面试题中我们介绍了 JDK 动态代理和 CGLIB 动态代理的区别,讲到了目标类实现了接口会使用 JDK 动态代理,反之则使用 CGLIB 动态代理。那么今天我们再继续深挖一下,目标类实现了接口一定会走JDK动态代理吗?答案是否定的,目标类实现了接口也不一定会走JDK动态代理。我们可以从源码中找到答案 👇

在 Spring AOP 底层会调用 AbstractAutoProxyCreator 类中的 createProxy() 方法来创建动态代理,在方法的最后一行则会返回动态代理对象。在创建动态代理对象之前,还会去校验被代理的类的接口是不是有效的接口。

在这里插入图片描述

只有被代理类的接口是有效接口时,才会创建 JDK 动态代理,下面我们就来一起看一下校验条件 👇

在这里插入图片描述

在这里插入图片描述

💡校验① isConfigurationCallbackInterface():被代理类所实现的接口不能是 Bean 生命周期的回调函数接口。

💡校验② isConfigurationCallbackInterface():接口的方法数量必须大于0。

下面我们通过代码实例更直观的看一下👇

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
我们这里定义了一个 UserService 类,它实现了 Bean 的声明周期回调接口 InitializingBean,同时定义了一个 MyAspect 切面类,切点就是 UserService 类中的 hello() 方法,让 UserService 被进行动态代理,此时我们启动该项目看一下输出结果 👇

在这里插入图片描述
通过结果我们可以看出,虽然目标类实现了接口,但由于实现的是 Bean 生命周期回调接口,所以并没有走 JDK 动态代理,而是 CGLIB 动态代理。同理,当我们把 UserService 类中的方法都删除掉,即 UserService 是一个空类,那么同样会走 CGLIB 动态代理。所以说目标类实现了接口也不一定会走 JDK 动态代理 ~

小结

📢 面试不是终点,而是技术成长的起点!持续关注本专栏,更多硬核内容在路上! 🚀
💻PS:如果觉得有用,别忘了点赞+收藏,你的支持是我更新的最大动力!❤️

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不肯过江东丶

您的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值