Kotlin 中的方法或类默认为 final。但是当我将 Service 类中的方法标记为 时@Transactional
,我意识到服务类及其所有方法都是开放的。因为要使@Transactional
方面发挥作用,服务类需要被代理,那么它必须是一个开放类,以便代理类可以扩展原始类。
(正如教程Kotlin 中的打开关键字所指出的,kotlin 默认是 final 的。
根据Spring文档AOP,因为我的服务类继承自抽象类而不是接口,所以代理是CGLIB代理。)
我是否误解了什么或者它是如何工作的?
@Service
class SomeService(...): SomeAbstractClass(...){
@Transactional
fun someMethod(...){...}
}
事实上,Spring 会自动配置服务类等以使其开放。
因为这对于 Spring 和其他框架的工作方式非常重要,所以 Kotlin 文档在这里讨论了它:全开放编译器插件