Micronaut Bean 初始化顺序



我正在使用micronaut框架开发Java应用程序。我想确保首先加载所有缓存(因此使用 @Context 和 @PostConstruct(来填充我的所有缓存。

加载完所有缓存后,我想加载一个特定的 bean ,BeanB(确保最终调用其@PostConstruct(。

我尝试将@Requires用于 BeanB(beans={cache1,cache2} 等(,但 BeanB @PostConstruct在所有缓存完成其@PostConstruct之前被调用。

您可以使用 BeanInitializedEventListener

以下是我如何理解您的用例的示例:


package com.micronaut.example
import io.micronaut.context.annotation.Factory
import io.micronaut.context.event.BeanInitializedEventListener
import io.micronaut.context.event.BeanInitializingEvent
import org.slf4j.LoggerFactory
import javax.annotation.PostConstruct
import javax.inject.Singleton
class Cache {
companion object {
private val log = LoggerFactory.getLogger(Cache::class.java)
}
fun initialized() {
log.info("initialize")
}
}
class Server(private val cache1: Cache, private val cache2: Cache) {
companion object {
private val log = LoggerFactory.getLogger(Server::class.java)
}

fun start() {
log.info("start")
cache1.initialized()
cache2.initialized()
}
}
@Factory
class ServerFactory {
companion object {
private val log = LoggerFactory.getLogger(ServerFactory::class.java)
}
internal lateinit var cache1: Cache
internal lateinit var cache2: Cache
private lateinit var server: Server

@PostConstruct
fun initialize() {
log.info("initialize")
server = Server(cache1, cache2)
server.start()
}
@Singleton
fun server(): Server {
return server
}
}
@Singleton
class CacheInitializer() : BeanInitializedEventListener<ServerFactory> {
companion object {
private val log = LoggerFactory.getLogger(CacheInitializer::class.java)
}
init {
log.info("constructor")
}
override fun onInitialized(event: BeanInitializingEvent<ServerFactory>): ServerFactory {
log.info("onInitialized")
event.bean.cache1 = Cache()
event.bean.cache2 = Cache()
return event.bean
}
}

要测试它:

package com.micronaut.example
import io.micronaut.test.annotation.MicronautTest
import org.junit.jupiter.api.Test
import javax.inject.Inject
@MicronautTest
class AppTest {
@Inject
private lateinit var first: Server
@Test
fun contextLoads() {
}
}

这将为您提供以下日志输出:


INFO  i.m.context.env.DefaultEnvironment - Established active environments: [test]
INFO  c.micronaut.example.CacheInitializer - constructor
INFO  c.micronaut.example.CacheInitializer - onInitialized
INFO  com.micronaut.example.ServerFactory - initialize
INFO  com.micronaut.example.Server - start
INFO  com.micronaut.example.Cache - initialize
INFO  com.micronaut.example.Cache - initialize

我希望日志是足够的信息,但是基本上一旦ServerFactory被实例化,BeanInitializedEventListener就会被调用,但在其他任何事情之前。在这里你可以设置一些参数。这可确保缓存是在服务器之前创建的

最新更新