Micronaut Bean初始化顺序

时间:2019-12-11 17:00:31

标签: micronaut

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

在加载所有缓存之后,我想加载特定的bean BeanB(确保最后调用其@PostConstruct)。

我尝试将@Requires用于BeanB(beans = {cache1,cache2}等),但是在所有Cache都使用其@PostConstruct完成之前,会调用BeanB @PostConstruct。

1 个答案:

答案 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就会被调用,但在其他任何事情之前。在这里您可以设置一些参数。这样可以确保您的缓存是在服务器之前创建的