别再说 Spring AOP 默认用的是 JDK 动态代理

关于标题的回答,在第二部分,别急。

话不多说,发车!

说下 AOP

AOP,Aspect Oriented Programming,面向切面编程。

将一些通用的逻辑集中实现,然后通过 AOP 进行逻辑的切入,减少了零散的碎片化代码,提高了系统的可维护性。

具体是含义可以理解为:通过代理的方式,在调用想要的对象方法时候,进行拦截处理,执行切入的逻辑,然后再调用真正的方法实现。

例如,你实现了一个 A 对象,里面有 addUser 方法,此时你需要记录该方法的调用次数。

那么你就可以搞个代理对象,这个代理对象也提供了 addUser 方法,最终你调用的是代理对象的 addUser ,在这个代理对象内部填充记录调用次数的逻辑,最终的效果就类似下面代码:

class A代理 {
    A a;// 被代理的 A
   void addUser(User user) {
     count();// 计数
     a.addUser(user);
   }
}
最终使用的是:
A代理.addUser(user);

这就叫做面向切面编程,当然具体的代理的代码不是像上面这样写死的,而是动态切入。

实现上代理大体上可以分为:动态代理和静态代理。

  • 动态代理,即在运行时将切面的逻辑进去,按照上面的逻辑就是你实现 A 类,然后定义要代理的切入点和切面的实现,程序会自动在运行时生成类似上面的代理类。
  • 静态代理,在编译时或者类加载时进行切面的织入,典型的 AspectJ 就是静态代理。

Spring AOP默认用的是什么动态代理,两者的区别

Spring AOP 的动态代理实现分别是:JDK 动态代理与 CGLIB。

默认的实现是 JDK 动态代理。

ok,这个问题没毛病(对实际应用来说其实不太准确),然后面试官接着问那你平时有调试过吗,确定你得到的代理对象是 JDK 动态代理实现的?

然后你信誓旦旦的说,对,我们都实现接口的,所以是 JDK 动态代理。

然而你简历上写着项目使用的框架是 SpringBoot,我问你 SpringBoot 是什么版本,你说2.x。

然后我就可以推断,你没看过,你大概率仅仅只是网上看了相关的面试题。

要注意上面说的默认实现是 Spring Framework (最新版我没去验证),而 SpringBoot 2.x 版本已经默认改成了 CGLIB。

而我们现在公司大部分使用的都是 SpringBoot 2.x 版本,所以你要说默认 JDK 动态代理也没错,但是不符合你平日使用的情况,对吧?

如果你调试过࿰

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值