我一直在尝试配置方面以进行日志记录,但是它根本无法正常工作,我正在使用kotlin和Spring boot,我已经在配置中使用注释添加了启用的AspectJ,但仍然无法正常工作。
@Aspect
@Component
class LoggingAspect {
private val log = LoggerFactory.getLogger(this.javaClass)
@Pointcut("within(@org.springframework.stereotype.Repository *)" +
" || within(@org.springframework.stereotype.Service *)")
fun springBeanPointcut() {
}
@Pointcut("within(com.xxxxx.backendcommon.domain.repository..*)" +
" || within(com.xxxxx.backendcommon.service..*)")
fun applicationPackagePointcut() {
}
@Around(value = "applicationPackagePointcut() & springBeanPointcut()")
@Throws(Throwable::class)
fun around(joinPoint: ProceedingJoinPoint): Any {
log.debug("Enter: {}.{}() with argument[s] = {}", joinPoint.signature.declaringTypeName,
joinPoint.signature.name, Arrays.toString(joinPoint.args))
val result = joinPoint.proceed()
log.debug("Exit: {}.{}() with result = {}", joinPoint.signature.declaringTypeName,
joinPoint.signature.name, result)
return result
}
}
答案 0 :(得分:0)
有些事情在这里可能是错误的,但总的来说,Spring AOP在Kotlin中工作。我在Java和Kotlin项目中使用了非常相似的方面,并且在两个方面的工作都相同。
要记住的一件事,Spring AOP is proxy-based,因此它只能建议 Spring Bean 的非最终, public 方法不会从Bean内调用(无自调用)。
对于Kotlin项目,您可能需要使用allopen
编译器插件来默认打开类和方法。
Spring数据存储库通常不使用@Repository
进行注释,而是通常从org.springframework.data.repository.Repository
的子接口扩展。因此,您的存储库切入点将不起作用。尝试以下方法:
@Pointcut("within(org.springframework.data.repository.Repository+)")
fun withinRepository() {}
使用此方法,您应该能够记录SimpleJpaRepository
的实际方法调用(默认的Spring Data存储库实现)。
您的@Around
中有一个错字,切入点与&&
而不是&
组合在一起。无论如何,我会在没有包切入点的情况下尝试使用它,以查看bean切入点是否正常工作。