gpt4 book ai didi

Kotlin 的 AOP

转载 作者:IT老高 更新时间:2023-10-28 13:43:05 29 4
gpt4 key购买 nike

我在 Java 中经常使用 AOP。看起来传统的 java 方法可以很容易地与 Kotlin 一起重用。鉴于 Kotlin 强调不变性,JDK 代理似乎是 Kotlin 中最可行的解决方案,前提是您遵循相同的接口(interface)优先(最好是 Kotlin 中的特征优先)编程风格,例如:

trait MyService {
fun add(a: Int, b: Int): Int
}

class MyServiceImpl: MyService {...}

所以现在可以轻松地在 Spring/AOP 中编写一个切面并将其应用到 MyServiceImpl 的实例中。应该提到的是,基于 Java 接口(interface)的生成代理可能更受 Kotlin 开发人员的青睐,因为 cglib 需要摆脱 final(即诉诸 Kotlin 中的开放类)并为每个应该由 AOP 代理包装的类使用无参数的公共(public)构造函数.

与此同时,不幸的是,基于 Java 接口(interface)的生成代理会带来显着的性能损失,所以我想知道在某些情况下,AOP 编程是否可以更直观地或原生地对 Kotlin 进行。

因此,当我想将 AOP 用于以下示例时,请考虑以下示例:

  • 记录从服务公开的每个方法的参数和返回结果。
  • 在函数调用之前启动事务并在函数调用完成后关闭它(提交/回滚取决于在进行特定服务调用时是否引发了异常)。

在上述使用 MyService/MyServiceImpl 的示例中,最有效但不幸的是最冗长的蛮力解决方案可能如下所示:

class MyServiceLoggingWrapper(val delegate: MyService): MyService {
val logger = LoggerFactory.getLogger(this.javaClass)

override fun add(a: Int, b: Int): Int {
val result = delegate.add(a, b);
logger.info("MyService.add({}, {}) = {}", a, b, result);
return result;
}
}

class MyServiceTxWrapper(val delegate: MyService, val txManager: TransactionManager): MyService {
// similar lengthy implementation
}

该方法的 LoC 复杂度为 O(N*K),其中 N 是方法的数量,K 是我想要应用的多个方面。

所以我正在寻找的是一种可能有效(在性能和 LoC 方面)的解决方案,用于 Kotlin 中的各个方面,最好不要求助于 cglib 生成的代理,因为它们施加了太多限制,比如告别最终类并且没有无参数的公共(public)构造函数。

最佳答案

我不是 Kotlin 用户,但鉴于它针对的是 JVM,我建议尝试成熟的 AspectJ,而不是像 Spring AOP 这样的基于代理的“AOP lite”方法。 AspectJ 不需要/使用动态代理,它会在编译时或编译后(二进制编织)甚至在类加载(加载时编织)期间生成字节码。

关于Kotlin 的 AOP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28356317/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com