将初始化代码添加到Spring Boot应用程序的正确方法是什么?

时间:2019-10-18 05:06:51

标签: java spring spring-boot

TLDR:我希望我的Spring Boot应用程序在启动时运行一些初始化代码。该代码需要访问Spring Bean和值。

我正在编写一个Spring Boot应用程序,它将同时使用一个队列中的多个消息。为此,它需要实例化多个使用者对象。 Spring是否有一个好的方法来实例化可配置数量的相同类的实例?

我必须使用的队列客户端充当线程池。它为我给它的每个消费者对象创建一个线程。使用者对象一次只接收一条消息,它们必须完全处理并确认该消息,然后才能接收另一条消息。使用者不是线程安全的,所以我不能只使用单例实例。

我考虑了以下方法,但我觉得不合适。似乎滥用了@Component注释,因为Initializer实例在构造后没有使用。有什么更好的方法呢?

@Component
public class Initializer {

    public Initializer(ConsumerRegistry registry, @Value("${consumerCount}") int consumerCount) {
        for (int i = 0; i < consumerCount; i++) {
            // Each registered consumer results in a thread that consumes messages.
            // Incoming messages will be delivered to any consumer thread that's not busy.
            registry.registerConsumer(new Consumer());
        }
    }

}

1 个答案:

答案 0 :(得分:1)

ApplicationListener可以满足您的需求。它会在注册事件时得到通知,例如当ApplicationContext准备好时。您将拥有对所有Bean和注入的完全访问权限。

@Component
public class StartupApplicationListener implements ApplicationListener<ApplicationReadyEvent> {

    @Inject
    private ConsumerRegistry registry;

    @Inject
    @Value("${consumerCount}")
    private int consumerCount;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        //do your logic
        for (int i = 0; i < consumerCount; i++) {
            // Each registered consumer results in a thread that consumes messages.
            // Incoming messages will be delivered to any consumer thread that's not busy.
            registry.registerConsumer(new Consumer());
        }
    }
}