当我在 applicationContext.xml 中声明 beans 和 component-scan 时会发生什么?

What happens when I declare beans and component-scan both in applicationContext.xml?

我在 Java 中有一个项目 Spring。我想问一下,如果我声明 beans(在元素 <beans> 中)并且组件扫描到我的 applicationContext.xml 中(如代码所示),会发生什么情况。 我在每个 class.

中也有注释 @Component("someName")

我已经尝试删除 bean 的声明并且在我的 xml 中只有组件扫描 - 效果很好。当我删除组件扫描并且在我的 xml 中只有 bean 声明时 - 它导致 classes 出现错误并且一些 classes 没有调用其他 classes。

<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 中同时声明组件扫描和 beans,它又是如何工作的。 bean 实例是否创建两次?那为什么它不能在没有组件扫描的情况下工作。

组件扫描和显式 bean 引用是两个不同的东西:

  1. 组件扫描:

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

这是自动配置,用于扫描提到的包并创建和注册 bean 以及自动装配。

  1. 显式 bean 引用: Spring 希望您定义 bean 拥有的所有 bean 引用(手动连接)。所以你需要明确定义对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"/>
    

Bean 实例只创建一次,您显式创建的 Bean 优先于组件扫描。

一些参考:

  1. Beans-autowiring-xml
  2. Beans-classpath-scanning
  3. spring-auto-scanning-components