spring - 我可以编写一个使用 Autowiring Spring bean 的 Kotlin 扩展函数吗?

标签 spring kotlin

我正在尝试创建一个扩展函数,其实现使用 Spring bean。通过在包的顶层定义扩展函数似乎不可能做到这一点。我试过这个:

@Component
class Converter {

    companion object {
        @Autowired
        lateinit var transformer: Transformer

        fun Class1.convert(): Class2 {
            return Class2 (this, transformer.transform(someStringProperty))
        }
    }    
}

在哪里 transform是将某个字符串转换为另一个字符串的函数,Class1是一些具有 someStringProperty 的类属性(property)。我希望其他类(class)可以import pkg.Converter.Companion.convert然后可以使用x.convert()在哪里 xClass1 类型的对象.

语法有效,并使用 x.convert()在其他类中编译得很好。但它会在运行时导致异常:kotlin.UninitializedPropertyAccessException: lateinit property transformer has not been initialized
看起来 Spring 没有 Autowiring 变量,因为它位于伴随对象中,而不是实际的组件对象中。

@Component 注释伴随对象没用。

我不认为移动Class1.convert直接在Converter会工作,因为然后使用 x.convert()将需要 Converter 的实例对象,我看不到如何使用扩展函数语法来做到这一点。

有什么办法可以做到这一点,还是我必须放弃扩展函数语法?

最佳答案

扩展函数可以使用文件范围私有(private)变量,并在
组件的@PostConstruct 方法,将“this”分配给私有(private)变量。
这种设计增加了从组件到扩展功能的依赖,
现在它们都绑定(bind)到同一个私有(private)变量。但如果他们都遇到同样的问题,我认为这是可以容忍的,似乎没有其他更好的方法。

@Component
public class ClassOne {
    var value = Random.nextInt()

    @PostConstruct
    private fun init() {
        c1 = this
    }
}

private lateinit var c1 : ClassOne
fun String.appendC1() : String {
    return this + c1.value
}

及其测试代码:
@RunWith(SpringRunner::class)
@ContextConfiguration(classes = [ClassOne::class])
class DependencyInjectionTest {
    @Autowired
    lateinit var autowiredConfiguration : ClassOne

    @Test
    fun testAccessComponentInExtension() {
        Assert.assertEquals(autowiredConfiguration.value, c1.value)
    }
}

关于spring - 我可以编写一个使用 Autowiring Spring bean 的 Kotlin 扩展函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46596751/

相关文章:

java - Spring REST 总是返回 404 Not Found

java - Spring Boot Quartz 调度程序配置

spring - Webflux Spring 2.1.2 自定义Content-Type

android - 使用 Gpt 声明依赖项时,Gpt 和 Gradle 中的实现有什么区别?

安卓喷气背包 : lifecycle-aware recurrent periodic task execution with LiveData and ViewModels

kotlin - 绑定(bind)自定义数据类型将 null 传输到转换器

java - 保护 JMS 消息驱动 channel 适配器的安全

java - 如何在没有 spring @Component 或 @Bean 注释的情况下在我的项目中运行不同项目的 servlet-filter

android - Pepper QISDK同步调用是否可以确保结果?

java - 如何使用 RabbitMQ 和 Spring-AMQP 通过 MQTT 传输并在 AMQP 上接收