如何在Micronaut中将java.time.Clock实例作为Bean注入?
在Micronaut中注入java.time.Clock的正确方式
问题回顾
你的FooListener控制器依赖java.time.Clock,但Micronaut上下文里没有对应的Bean,导致启动报错。之前尝试的两种方法无效的原因分别是:
Application是Kotlin object,不属于Micronaut管理的Bean,所以@PostConstruct注解不会被触发;@io.micronaut.context.annotation.Configuration是包级注解,不能用在类上,未标注有效注解的ClockConfig不会被Micronaut扫描到。
方案一:使用@Factory定义Clock Bean
给配置类添加@Factory注解,让Micronaut识别这是一个Bean工厂类,通过@Bean方法生成Clock实例并注册到上下文:
import io.micronaut.context.annotation.Factory import java.time.Clock @Factory class ClockConfig { @Bean fun clock(): Clock = Clock.systemUTC() }
Micronaut启动时会自动扫描这个类,执行clock()方法并将返回的实例作为Singleton Bean存入上下文,FooListener就能正常注入Clock了。
方案二:在应用启动时直接注册Singleton
在Micronaut构建器中通过beans()方法直接注册Clock实例,确保启动时上下文已包含该Bean:
object Application { @JvmStatic fun main(args: Array<String>) { Micronaut.build() .eagerInitSingletons(true) .eagerInitConfiguration(true) .mainClass(Application.javaClass) .beans(Clock.systemUTC()) // 直接注册Clock单例 .start() } }
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

