Caching 使用@Cacheable时,Spring Boot不会自动初始化记录器

Caching 使用@Cacheable时,Spring Boot不会自动初始化记录器,caching,spring-boot,logging,kotlin,Caching,Spring Boot,Logging,Kotlin,我看到一种奇怪的行为。每当我使用以下注释方法时: @Cacheable("contacts") (主类用@EnableCaching注释) 在任何方法中,我将此logger变量设置为null: private val logger = LoggerFactory.getLogger(ProductCriteria::class.java) 如果我把它拿出来,它就不再是空的了。 从我的调试来看,cglib似乎正在创建一些类代理来提供缓存。但是,该代理并没有像看上去那样正确初始化 这是出于设计、

我看到一种奇怪的行为。每当我使用以下注释方法时:

@Cacheable("contacts")
(主类用
@EnableCaching
注释) 在任何方法中,我将此
logger
变量设置为
null

private val logger = LoggerFactory.getLogger(ProductCriteria::class.java)
如果我把它拿出来,它就不再是空的了。 从我的调试来看,cglib似乎正在创建一些类代理来提供缓存。但是,该代理并没有像看上去那样正确初始化


这是出于设计、限制还是我遗漏了什么?

它已正确初始化。代理的所有字段都未初始化,实际对象的字段将被初始化(至少在常规Java中,不确定这是否会随着Kotlin的加入而改变)。当使用
final
方法(我相信kotlin的默认方法)时,这是有问题的,因为final方法没有代理(这同样适用于其他非
public
方法)。感谢您的解释。有解决办法吗?为什么会有解决办法?这是预期的行为…那么我如何在代理类中进行日志记录呢?代理仅用于应用建议,日志记录应该仍然有效。如果没有,则意味着您有
final
方法(基本上不允许使用基于类的代理)。使用基于接口的代理或删除Kotlin中的
final
关键字(即
open-fun
),该关键字已正确初始化。代理的所有字段都未初始化,实际对象的字段将被初始化(至少在常规Java中,不确定这是否会随着Kotlin的加入而改变)。当使用
final
方法(我相信kotlin的默认方法)时,这是有问题的,因为final方法没有代理(这同样适用于其他非
public
方法)。感谢您的解释。有解决办法吗?为什么会有解决办法?这是预期的行为…那么我如何在代理类中进行日志记录呢?代理仅用于应用建议,日志记录应该仍然有效。如果没有,则意味着您有
final
方法(基本上不允许使用基于类的代理)。使用基于接口的代理或删除
final
关键字(即Kotlin中的
open fun
)。