我有一个使用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实例是否创建两次?那为什么它在没有组件扫描的情况下不起作用。
答案 0 :(得分:0)
组件扫描和显式bean引用是两件事:
<context:component-scan base-package="vs.project"/>
这是自动配置,用于扫描提到的程序包,并与自动装配一起创建和注册bean。
显式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创建优先于组件扫描。
一些参考: