Kotlin在SpringBoot中编写AOP时为什么不会报错?

122 阅读1分钟

前言

这篇文章是好久的了,但为什么写完没有发,不得而知,关于这个问题也是我突然发现的。

这个问题可能听起来很怪,当你使用Kotlin在Spring中写AOP时,按Kotlin的特性来说,其实是会报错的,但是实际上并不会,我们知道Kotlin默认的方法和类都是final的,意味着AOP会失效,因为CGLib库需要通过继承来完成切入,那么Kotlin和Spring AOP不会冲突吗?

确实会冲突,那就需要额外针对这种场景解决问题,所以Kotlin专门编写了一个插件,来适配这个问题,毕竟自己的特性导致其他产品在原本使用Java时可用,切换到Kotlin就不能用了,是不能忍受的,但也不能让Spring来写这个插件,毕竟说不过去。

Kotlin提供的这个插件叫All-open compiler plugin,回到你的项目中,你会发现项目中可能有一个这个插件。

kotlin("plugin.spring") version "1.5.31"

这个插件中就会引入All-open compiler,在查看依赖树中可以看到有org.jetbrains.kotlin:kotlin-allopen:1.7.10

而这个插件会为@Configuration等这些注解进行开放,也就是把final去掉。