#java #spring
#java #spring
Вопрос:
Я хотел бы спросить, есть ли способ обнаружить, что все компоненты были созданы в Spring Framework?
Я использую класс FileSystemXmlApplicationContext библиотеки Spring для загрузки в мой конфигурационный XML Spring.
Я понимаю, что я могу получить все компоненты после их создания на bean factory. Мое тупое решение заключается в использовании метода getBean (String name) в Spring API и сверке со всеми желаемыми компонентами в XML конфигурации Spring. Если все требуемые компоненты могут быть найдены, я могу сделать вывод, что все компоненты были созданы.
Причина, по которой я не предпочитаю тупое решение, заключается в том, что каждый раз, когда я обновляю свой конфигурационный XML, мне нужно обновлять исходный код для повторной проверки. Если это решение имеет больше уязвимостей, пожалуйста, не стесняйтесь указывать.
Спасибо за ваше время и любезные предложения
Комментарии:
1. когда вы запускаете свое приложение в консоли, вы можете увидеть свои компоненты spring. Вы можете проверить это, выполнив поиск известного компонента
2. @Fede Это мое тупое решение?
3. Я не понимаю, почему вы проверяете, создан ли экземпляр компонента. Вы не доверяете spring? Или доверять xml, который вы пишете?
4. @ohiocowboy Хороший запрос, я доверяю Spring и уже протестировал XML, который я написал. Работал нормально. Но мне нужно, чтобы моя система удалила эти конфигурационные XML-файлы после того, как все компоненты были успешно загружены и созданы. Это соображение из соображений безопасности.
Ответ №1:
Вы можете добавить BeanPostProcessor в свой контекст
class B1 implements BeanPostProcessor {
List beans = new ArrayList();
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
beans.add(bean);
return bean;
}
List getBeans() {
return beans;
}
...
Комментарии:
1. Спасибо, я попробую сначала!
2. Евгений Дорофеев, после того, как я получил все компоненты, созданные из BeanPostProcessory, я думаю, мне все еще нужно проверить желаемые компоненты в моем файле конфигурации, не так ли?
3. Я думаю, вам это не нужно, postProcessBeforeInitialization будет вызываться для всех компонентов в конфигурации, поэтому список будет содержать все доступные компоненты
Ответ №2:
Как насчет использования getBeansOfType(Object.class )?
Вы получите карту, содержащую все пары имя-компонент в контексте приложения. Это также версия, включающая не синглтоны, но вы получите только компоненты верхнего уровня.