Обнаружение всех компонентов, созданных в Spring framework

#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 )?

Вы получите карту, содержащую все пары имя-компонент в контексте приложения. Это также версия, включающая не синглтоны, но вы получите только компоненты верхнего уровня.