Мне пришлось создать одноэлементный бин вручную в классе @Configuration
, чтобы поделиться им, не подвергая его воздействию контекста (который вызывает условные / автоконфигурации).Мне указали на осознание определенных рисков, чтобы управлять им самостоятельно:
- Потокобезопасность потока: Объект источника данных не является состоянием без состояния
- Утечка ресурса: объект источника данных не был явно закрытпо контексту
Код следующий:
private DataSource nonExposedDatasource;
public DataSource nonExposedSingletonDataSource() {
if (Objects.isNull(this.nonExposedDatasource)) {
this.nonExposedDatasource = this.myPrivateDatasourceProperties.initializeDataSourceBuilder().build();
}
return this.nonExposedDatasource;
}
@Bean
public TaskConfigurer taskConfigurer() {
return new DefaultTaskConfigurer(this.nonExposedSingletonDataSource());
}
@Bean
public BatchConfigurer batchConfigurer() {
return new DefaultBatchConfigurer(this.nonExposedSingletonDataSource());
}
Мой вопрос: действительно ли у меня есть риск пропустить это?Разве весна не достаточно умна?
Что касается безопасности потоков, я понимаю, что из-за проблем с моим кодом должно произойти 2 потока, обрабатывающих @Configuration.Весна делает это ??
Что касается утечки ресурса, если бы моим источником данных был @Bean, управляемый Spring, как и большинство приложений, не было бы это потенциальной ловушкой, если бы приложение все равно закрылось?
Как бы вы сделали этот код безопаснее?