#java #spring
Вопрос:
Это вопрос о поведении Spring по умолчанию. Допустим, у меня есть одноэлементный компонент под названием BeanA, который имеет зависимость конструктора от одноэлементного компонента под названием BeanB. BeanB должен быть создан до BeanA, чтобы удовлетворить эту зависимость. Если оба компонента реализуют интерфейс DisposableBean, я ожидал бы, что метод destroy будет вызван в обратном порядке, в котором были созданы компоненты, но я не вижу, чтобы он упоминался в документации. Лучшее, что я нашел, — это документация для аннотации dependsOn (https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/DependsOn.html) но в нем не упоминается, каково поведение, когда dependsOn не используется.
Редактировать: Как я уже упоминал в комментарии ниже: я попробовал это, и в моем тесте это работает так, как ожидалось. Бина уничтожается раньше БинбА. Я хотел бы получить некоторую документацию или что-то подобное, чтобы знать, что это всегда так.
Комментарии:
1. Попробуйте отладить его с помощью
@PreDestroy
аннотации![]()
2. Я должен был упомянуть, что я опробовал его, и в моем тесте он работает так, как ожидалось. Бина уничтожается раньше БинбА. Я хотел бы получить некоторую документацию или что-то подобное, чтобы знать, что это всегда так.
3. Помните, что документация не всегда является полной, и невозможно охватить все крайние случаи. Если вы считаете, что эта информация будет важна для дальнейших читателей, не стесняйтесь отправлять запрос на извлечение (документы Spring версируются на GitHub с использованием Asciidoctor . Создатели всегда приветствуют ваш вклад!
![]()
4. Теоретически это будет сделано в обратном порядке (проверьте источник
DefaultSingletonBeanRegistry
. Одноразовые бобы хранятся вLinkedHashMap
порядке сохранения и повторяются в обратном порядке. Так что теоретически этого должно быть достаточно. Однако, если вы смешиваетесьDisposableBean
с@PreDestroy
ним, это может не сработать полностью, так как при их выполнении также есть порядок.
Ответ №1:
После тестирования и просмотра исходного кода Spring (например, DefaultSingletonBeanRegistry, упомянутый М. Дейнум в комментарии) Я обнаружил, что два одноэлементных компонента, один из которых зависит от другого, действительно будут уничтожены в обратном порядке, в котором они были созданы. Когда я думаю об этом, мне трудно представить, как это могло бы работать по-другому. Если бы бобы не были уничтожены в обратном порядке, это вызвало бы массу проблем. Например, во время завершения работы приложения компонент может попытаться использовать другой компонент, который уже был уничтожен. К сожалению, я до сих пор не нашел никакого подтверждения такого поведения в документации.