我正在使用micronaut框架开发Java应用程序。我想确保所有缓存均先加载所有缓存(并因此使用@Context和@PostConstruct)。
在加载所有缓存之后,我想加载特定的bean BeanB(确保最后调用其@PostConstruct)。
我尝试将@Requires用于BeanB(beans = {cache1,cache2}等),但是在所有Cache都使用其@PostConstruct完成之前,会调用BeanB @PostConstruct。
答案 0 :(得分:0)
您可以利用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
我希望日志能提供足够的信息以备不时之需,但是一旦BeanInitializedEventListener
实例化后,ServerFactory
就会被调用,但在其他任何事情之前。在这里您可以设置一些参数。这样可以确保您的缓存是在服务器之前创建的