2015-09-22 5 views
1

У меня есть два компонента (класс A и класс B), определенные в файле XML. Когда я их запускаю, DefaultListableBeanFactory сначала создает экземпляр класса A, затем экземпляр класса B. Затем я копирую классы в отдельный пакет и вношу некоторые незначительные изменения. Когда я запускаю классы из нового пакета, DefaultListableBeanFactory сначала создает экземпляр класса B, а затем экземпляр класса A. Почему Spring изменила порядок инициализации? Это не кажется случайным (то есть в старом пакете всегда начинается класс A, в новом пакете всегда начинается класс B). Я могу (и, вероятно, должен) добавить тег «зависит от» к определению класса B, чтобы обеспечить согласованный порядок начала, но я хотел бы знать, почему он работал в старом пакете.Какой порядок весенних бобов?

+0

Порядка инициализации боба не имеет значения, так как поля вводятся после создания боба. Единственная проблема, когда порядок будет иметь значение, - это когда бит необходим в аргументе конструктора другого класса, но Spring замечает это и решит его. –

+0

Как вы говорите, вы не должны зависеть от этого. Если две боны действительно зависят друг от друга, Spring будет следить за тем, чтобы зависимая была инициализирована после зависимого пользователя. Кроме того, это все догадывается. Возможно, полные имена классов помещаются в хэш-карту, и это тот порядок, в который они возвращаются. – biziclop

+0

Ну, на самом деле класс B зависит от побочного эффекта от класса A, но поскольку он всегда работал в старом пакете и всегда работает на другие разработчики компьютеров в новом пакете, никто не заметил зависимости. – user2414208

ответ

0

Весна будет использовать ClassPathBeanDefinitionScanner, чтобы найти все ваши компоненты и зарегистрировать их в BeanDefinitionRegistry. Внутри он будет использовать PathMatchingResourcePatternResolver. Бобы будут добавлены в том порядке, в котором они будут обнаружены, а позже весна будет перебирать их и загружать в этом порядке, разрешая необходимые зависимости (см. DefaultListableBeanFactory.preInstantiateSingletons).

Идея механизма Spring заключается в том, чтобы скрыть от вас все это и гарантировать хорошо построенный графический объект в контексте вашего приложения, как только ваши определения верны (Spring может создать экземпляр вашего компонента, Spring может разрешить свои зависимости ...)

от DefaultListableBeanFactory:

/** List of bean definition names, in registration order */ 
private final List<String> beanDefinitionNames = new ArrayList<String>(64); 
Смежные вопросы