如何使标准 Java 类的实例可用作 bean?

问题描述 投票:0回答:1

我有一个 Micronaut 控制器,它将

java.time.Clock
作为依赖项:

@Controller("/foo")
class FooListener (
    private val clock: Clock,
) {
    // ...
}

IntelliJ 警告:

不满足的依赖关系:没有bean与注入点匹配
检验信息: 报告 Bean 类中缺少或不明确依赖项的注入点。

并且应用程序未启动:

Error starting Micronaut server: Bean definition [FooListener] could not be loaded: Failed to inject value for parameter [clock] of class: FooListener
Message: No bean of type [java.time.Clock] exists.

我在主应用程序实例中尝试了

@PostConstruct

object Application {
    @JvmStatic
    fun main(args: Array<String>) {
        Micronaut.build()
            .eagerInitSingletons(true)
            .eagerInitConfiguration(true)
            .mainClass(Application.javaClass)
            .start()
    }

    @PostConstruct
    fun onStart(context: ApplicationContext) {
        context.registerSingleton(Clock::class.java, Clock.systemUTC())
    }
}

但这似乎被忽视了;也许

main
中的代码首先运行,并且问题发生在
@PostConstruct
运行之前。

添加这个小包装类也没有帮助:

class ClockConfig {
    @Bean
    fun clock(): Clock = Clock.systemUTC()
}

当我将

@io.micronaut.context.annotation.Configuration
添加到该
ClockConfig
类时,编译器会抱怨“此注释不适用于目标‘类’”,并且看起来它适用于包。

如何将时钟放入应用程序上下文中,并将

Clock.systemUTC()
作为值?

kotlin dependency-injection micronaut
1个回答
0
投票

看起来工厂就可以做到这一点:

import io.micronaut.context.annotation.Factory
import jakarta.inject.Singleton
import java.time.Clock

@Factory
class ClockFactory {
    @Singleton
    fun clock(): Clock = Clock.systemUTC()
}
© www.soinside.com 2019 - 2024. All rights reserved.