Как вызвать @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-компонентов и найти другой обходной путь (уничтожая их один за другим). На мой взгляд, вы можете реализовать отдельный класс менеджера, выполняющий операции над вашими контейнерами.

Другие вопросы по тегам