【问题标题】:What happens when I declare beans and component-scan both in applicationContext.xml?当我在 applicationContext.xml 中声明 bean 和组件扫描时会发生什么?
【发布时间】:2019-04-16 07:10:46
【问题描述】:

我有一个带有 Spring 的 Java 项目。我想问如果我声明 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>

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

【问题讨论】:

    标签: xml spring javabeans


    【解决方案1】:

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

    1. 组件扫描

    &lt;context:component-scan base-package="vs.project"/&gt;

    这是自动配置,用于扫描提到的包并创建和注册 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

    【讨论】:

      猜你喜欢
      • 2012-11-27
      • 2015-07-17
      • 2022-01-06
      • 1970-01-01
      • 2021-11-08
      • 2014-08-05
      • 2023-03-16
      • 1970-01-01
      • 2015-03-31
      相关资源
      最近更新 更多