gpt4 book ai didi

Spring Kotlin DSL : get all beans of certain type

转载 作者:行者123 更新时间:2023-12-02 12:42:45 25 4
gpt4 key购买 nike

假设我有一个接口(interface) Yoyo以及这个接口(interface)的不同实现:

interface Yoyo { 
fun haha() {
println("hello world")
}
}

@Component class Yoyo1 : Yoyo
@Component class Yoyo2 : Yoyo
@Component class Yoyo3 : Yoyo
@Component class YoyoN : Yoyo
现在我想实例化所有bean并在上下文初始化后做一些逻辑:
@SpringBootApplication
class YoyoApp

fun main(args: Array<String>) {
SpringApplicationBuilder()
.sources(YoyoApp::class.java)
.initializers(beans {
bean {
CommandLineRunner {
val y1 = ref<Yoyo1>()
val y2 = ref<Yoyo2>()
val y3 = ref<Yoyo3>()
val yN = ref<YoyoN>()
arrayOf(y1, y2, y3, yN).forEach { it.haha() }
}
}
})
.run(*args)
}
我不想手动获取所有bean的引用(这很乏味),而是这样做:
val list = ref<List<Yoyo>>()
list.forEach { it.haha() }
但是我得到一个异常(exception):
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'java.util.List<?>' available
我知道我可以这样做,但我想改用新的 Kotlin DSL:
@Component
class Hoho : CommandLineRunner {
@Autowired
lateinit var list: List<Yoyo>

override fun run(vararg args: String?) {
list.forEach { it.haha() }
}
}
是否可以?有任何想法吗?
附言这里是 gist .

最佳答案

context @zsmb13 在上一个答案中提到的是 left internal赞成provider<Any>()函数(从 Spring 5.1.1 开始)。所以最后我得到了以下结果:

interface Yoyo {
fun haha() {
println("hello world from: ${this.javaClass.canonicalName}")
}
}

@Component class Yoyo1 : Yoyo
@Component class Yoyo2 : Yoyo
@Component class Yoyo3 : Yoyo
@Component class YoyoN : Yoyo


@SpringBootApplication
class YoyoApp

fun main(args: Array<String>) {
SpringApplicationBuilder()
.sources(YoyoApp::class.java)
.initializers(beans {
bean {
CommandLineRunner {
val list = provider<Yoyo>().toList()
list.forEach { it.haha() }
}
}
})
.run(*args)
}

关于Spring Kotlin DSL : get all beans of certain type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49936982/

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