You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:24:57