У меня есть проект на Java с Spring. Я хочу спросить, что произойдет, если я объявлю bean-компоненты (в элементе <beans>), а также сканирую компоненты в свой applicationContext.xml (как показано в коде).
У меня также есть аннотация @Component("someName") в каждом классе.
Я уже пытался удалить объявления bean-компонентов, и в моем xml было только сканирование компонентов - это сработало хорошо. Когда я удалил компонентное сканирование и в моем xml было только объявление bean-компонентов, это вызвало ошибку в классах, и некоторые классы не вызывали другие классы.
<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>
Я думал, что он должен работать хорошо в обоих случаях, но это не так. Итак, я спрашиваю здесь, как это работает и как это работает, если я объявлю как компонентное сканирование, так и bean-компоненты в applicationContext.xml. Экземпляры bean-компонентов создаются дважды? Тогда почему он не работает без сканирования компонентов.





Сканирование компонентов и явная ссылка на компонент — это две разные вещи:
<context:component-scan base-package = "vs.project"/>
Это автоматическая конфигурация для сканирования упомянутого пакета, создания и регистрации bean-компонентов вместе с автоматическим подключением.
Явная ссылка на компонент: Spring ожидает, что вы определите все ссылки на компоненты, которые у вас есть (ручное подключение). Поэтому вам нужно явно указать ссылку на определение bean-компонента.
<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"/>
Экземпляры компонента создаются только один раз, и ваше явное создание компонента имеет приоритет над сканированием компонентов.
Некоторая ссылка: