Порядок инициализации Micronaut Bean

Я работаю над Java-приложением с использованием фреймворка micronaut. Я хочу убедиться, что все мои кеши сначала загружены (и, следовательно, с использованием @Context и @PostConstruct) для всех моих кешей.

После того, как все мои кеши загружены, я хочу загрузить конкретный bean-компонент, BeanB (убедившись, что его @PostConstruct вызывается в конце).

Я пробовал использовать @Requires для BeanB (beans = {cache1, cache2} и т. Д., Но BeanB вызывается @PostConstruct до того, как все кеши будут выполнены с их @PostConstruct.


person Ashish Garg    schedule 11.12.2019    source источник
comment
Я не совсем понимаю, в чем проблема, но если у вас есть bean-компонент, который зависит от ваших bean-компонентов кеша, и вы вводите bean-компонент кеша в bean-компонент, который от него зависит, bean-компонент кеша обязательно будет готов до того, как bean-компонент, который от него зависит пытается использовать это, не так ли?   -  person Jeff Scott Brown    schedule 12.12.2019
comment
да, это работает, но я хотел бы сохранить его отдельно. Есть ли что-то вроде Spring @Depends (у которого может быть список имен bean-компонентов. Таким образом, у меня не будет зависимости времени компиляции от моих кешей и родительского bean-компонента   -  person Ashish Garg    schedule 12.12.2019
comment
Что взаимодействует с кеш-компонентами?   -  person Jeff Scott Brown    schedule 12.12.2019
comment
мой BeanB на самом деле является финальным сервером, который я хочу запустить в конце (только после загрузки моих кешей). ‹Br/› class BeaB {@PostConstruct public void start () {... startFinagleServer} .. ‹br/› Я не хочу вводить какие-либо зависимости кеша в этот класс, поскольку все, что он делает, это прослушивает запросы. Процессоры RequestProcessors для сервера Finagle фактически используют компоненты кеширования.   -  person Ashish Garg    schedule 13.12.2019


Ответы (1)


Вы можете использовать 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, но прежде всего. Здесь вы можете установить некоторые параметры. Это гарантирует, что ваш кеш был создан до того, как ваш Сервер

person Coco    schedule 20.12.2019