当我在applicationContext.xml中同时声明bean和组件扫描时会发生什么?

时间:2019-04-16 07:10:46

标签: xml spring javabeans

我有一个使用Spring的Java项目。我想问一下,如果我声明bean(在元素<beans>中)并且还对我的applicationContext.xml进行组件扫描(如代码所示),会发生什么情况。 我还在每个课程中都标注了@Component("someName")

我已经尝试删除bean的声明,并且在我的xml中仅进行了组件扫描-效果很好。当我删除component-scan并在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>

我认为它在两种情况下都应该运行良好,但事实并非如此。因此,我在这里问它是如何工作的,以及如果我在applicationContext.xml中同时声明了component-scan和bean,它是如何工作的。 Bean实例是否创建两次?那为什么它在没有组件扫描的情况下不起作用。

1 个答案:

答案 0 :(得分:0)

组件扫描和显式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