@autowired但得到了lateinit属性testbean尚未初始化错误

flvlnr44  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(318)

我有以下课程(部分代码):

@Component
class TestClass: InitializingBean, DisposableBean {

    @Autowired
    private lateinit var testBean: SomeObject

    override fun afterPropertiesSet(){
        log.info("testBean 1: $testBdean")
    }

    fun testFunction(testName: String): Boolean {
       log.info("testBean 2: $testBdean")
    }

    @Throws(Exception::class)
    override fun destroy() {

    }
}

我看到testbean 1已成功运行,但testbean 2给出错误:lateinit属性testbean尚未初始化。那么testbean是在afterpropertiesset()中初始化的,在其他函数中不可用?我知道如果我们把testbean放在构造器testclass(testbean)中,它将被初始化并可用于所有函数。但是还有其他方法吗?因为testclass将从其他包调用,并且不是每个包都可以将testbean传递给构造函数。

yfwxisqw

yfwxisqw1#

你可以创造一个 object 那是你的 TestClass 并使用该保持器来引用您的create组件
比如:

@SpringBootApplication
class DemoApplication

fun main(args: Array<String>) {
    runApplication<DemoApplication>(*args)
}

@Component
class SomeObject(val name:String = "some object")

@Component
class TestClass(val someObject: SomeObject) {
    init {
        TestClassHolder.testClass = this
    }
    fun test() = someObject.name

}

object TestClassHolder {
    lateinit var testClass: TestClass
}

class NotBeanClass {
    fun call() = TestClassHolder.testClass.test()
}

@RestController
class TestController {

    @GetMapping
    fun test() = NotBeanClass().call()

}

相关问题