使用依赖注入在启动时配置静态字段 Spring

Configure static field on boot with dependency injection Spring

我需要在启动我的应用程序时配置一个 class 的静态字段,使用通过依赖注入获得的对象。
特别是,我有一个管理通知渠道的 class,class 应该有一些“默认渠道”可供使用,如下所示:

public class CustomerNotificationPreference {
    static List<NotificationChannel> defaults = List.of();
    Long id;
    List<NotificationChannel> channels;
}

非静态字段一切正常,但我找不到使用依赖注入配置 defaults 的方法。

到目前为止我尝试过的是:


@SpringBootApplication(scanBasePackages = {"com..."})
@EnableJpaRepositories("com...")
public class MyApp {

    @Bean
    void configureDefaultChannel(
        TelegramBot telegramBot,
        JavaMailSender javaMailSender,
        @Value("${telegram-bot.default-chat}") String chatId,
        @Value("${mail.default-receiver}") String to
    ){
        CustomerNotificationPreference.setDefaults(List.of(
            new TelegramNotificationChannel(telegramBot, chatId),
            new MailNotificationChannel(javaMailSender, to)
        ));
    }

}

但显然 Spring 不允许这样做,因为 Bean 不能为空 (Invalid factory method 'configureDefaultChannel': needs to have a non-void return type!)...有没有办法做这种事情?

您不能直接自动装配静态字段,但您可以在应用程序初始化后使用 @PostConstruct 或捕获 ApplicationReadyEvent

设置静态字段
public class MyApp {

    @Autowired
    TelegramBot telegramBot;

    @Autowired
    JavaMailSender javaMailSender

    @Value("${telegram-bot.default-chat}")
    String chatId;

    @Value("${mail.default-receiver}") 
    String to;

    @PostConstruct
    void setDefaults() {
        CustomerNotificationPreference.setDefaults(List.of(
            new TelegramNotificationChannel(telegramBot, chatId),
            new MailNotificationChannel(javaMailSender, to)
        ));
    }

    // OR

    @EventListener(ApplicationReadyEvent::class)
    void setDefaults() { 
        // same code as above
    }
    
}