Что происходит, когда я объявляю bean-компоненты и компонентное сканирование как в applicationContext.xml? - PullRequest
0 голосов
/ 16 апреля 2019

У меня есть проект на Java с Spring.Я хочу спросить, что произойдет, если я объявлю bean-компоненты (в элементе <beans>), а также компонентное сканирование в мой applicationContext.xml (как показано в коде).У меня также есть аннотация @Component("someName") в каждом классе.

Я уже пытался удалить объявления bean-компонентов и имел только компонентное сканирование в моем xml - это работало хорошо.Когда я удалил компонентное сканирование и у меня было только объявление bean-компонентов в моем xml - это вызвало ошибку в классах, и некоторые классы не вызывали другие классы.

<context:component-scan base-package="vs.project" />
<beans>
     <bean name="create" class="vs.project.command.create"/>
     <bean name="update" class="vs.project.command.update"/>
     <bean name="delete" class="vs.project.command.delete"/>
</beans>

Я думал, что в обоих случаях он должен работать хорошоно это не так.Поэтому я спрашиваю здесь, как это работает и как это работает, если я объявляю и - компонент-сканирование, и компоненты в applicationContext.xml.Создаются ли экземпляры bean дважды?Тогда почему он не работает без сканирования компонентов.

1 Ответ

0 голосов
/ 16 апреля 2019

Сканирование компонентов и явная ссылка на компонент - две разные вещи:

  1. Сканирование компонентов :

<context:component-scan base-package="vs.project"/>

Это автоматическая конфигурация для сканирования упомянутого пакета, а также для создания и регистрации bean-компонентов вместе с автоматическим подключением.

Явная ссылка на бин : Spring ожидает, что вы определите все ссылки на бины, которые есть у вашего бина (ручное подключение).Таким образом, вам нужно явно указать ссылку на определение компонента.

<bean id = "Driver" class = "vs.project.Driver">
   <property name="license" ref="license"/>
</bean>
<bean id="license" class="vs.project.License" >
   <property name="number" value="XYZ2434BD"/>
</bean>

или вы можете определить режим автоматического подключения, как показано ниже (это делается в случае component-scan):

<bean id="license" class="vs.project.License" autowire="byName"/>

Экземпляры компонента создаются только один раз, и ваше явное создание компонента имеет приоритет над сканированием компонента.

Некоторые ссылки:

  1. Beans-autowiring-xml
  2. Bean-classpath-scan
  3. пружинные авто-сканирующие компоненты
...