使用依赖注入在启动时配置静态字段 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
}
}
我需要在启动我的应用程序时配置一个 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
}
}