Как вызвать @PreDestroy для компонента, объявленного с аннотацией @Bean
У меня есть боб, объявленный с аннотацией @Bean
@Bean
public Set<DefaultMessageListenerContainer> beans() {
Set<DefaultMessageListenerContainer> containerSet = new HashSet<DefaultMessageListenerContainer>();
return containerSet;
}
У меня есть некоторые операции, которые нужно выполнить, когда я уничтожаю бин. Как я могу этого достичь?
Я знаю, что могу использовать аннотацию @predestroy для метода в классе, аннотированном @Component, но не знаю, как я могу это сделать, когда объявлена аннотация @Bean.
РЕДАКТИРОВАТЬ:
@Bean(destroyMethod="stopContainers")
public Set<DefaultMessageListenerContainer> containers() {
Set<DefaultMessageListenerContainer> containerSet = new HashSet<DefaultMessageListenerContainer>();
return containerSet;
}
public void stopContainers(){
Set<DefaultMessageListenerContainer> containerSet = containers();
......
}
}
Но я получаю сообщение об ошибке. Не удалось найти метод уничтожения с именем stopContainers для компонента с именем "контейнеры". Как это исправить?
2 ответа
Расширен от другого комментария - вот пример, чтобы обернуть:
@Bean(destroyMethod="stopContainers")
public StoppableSetWrapper<DefaultMessageListenerContainer> containers() {
StoppableSetWrapper<DefaultMessageListenerContainer> wrapper = new StoppableSetWrapper<>();
return wrapper;
}
public class StoppableSetWrapper<T> {
private final Set<T> containers = new HashSet<T>();
public boolean add(T container) {
return containers.add(container);
}
// other Set related methods as needed...
public void stopContainers() {
// clean up...
}
}
Код, который использует внедренный / автонастроенный компонент, должен быть обновлен, так как тип компонента изменился.
Как правило, вы можете указать destroyMethod
параметр для @Bean
аннотаций. И определите конкретную реализацию для этого метода в вашем классе бина.
Поскольку вы используете Set, у вас нет шансов добавить destroyMethod
в Set.class
, Таким образом, вы должны обернуть его (как предложил Эндрю).
На самом деле, мне не нравится такой подход вообще. Кажется более предпочтительным не использовать Set bean-компонентов и найти другой обходной путь (уничтожая их один за другим). На мой взгляд, вы можете реализовать отдельный класс менеджера, выполняющий операции над вашими контейнерами.