我得到以下内容:
2013-03-27 18:51:54,944 ERROR pringframework.web.context.ContextLoader: 227 - Context initialization failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'exporter' defined in URL ... Cannot resolve reference to bean 'dynamicNamingStrategy' while setting bean property 'namingStrategy'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'dynamicNamingStrategy' is defined
at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)
at
并且STS也在抱怨:
Multiple annotations found at this line:
- Referenced bean 'dynamicNamingStrategy'
not found
使用以下Spring上下文设置:
在一个项目中,我有一个jmx管理上下文(core-app-web-common-management-context.xml)及以下内容(摘录):
<context:annotation-config />
<context:component-scan
base-package="com.a.b.c.management.*" />
<bean id="exporter" class="org.springframework.jmx.export.MBeanExporter"
lazy-init="false">
<property name="autodetect" value="true"></property>
<property name="namingStrategy" ref="dynamicNamingStrategy"/>
其中dynamicNamingStrategy在不同的项目中定义(并打包到不同的jar中),并在上面的组件扫描中引用,如下所示
package com.a.b.c.management;
@Component("dynamicNamingStrategy")
public class DynamicNamingStrategy extends KeyNamingStrategy {
......
上面的Spring上下文又被导入到位于同一项目中的主上下文中:
<import resource="classpath*:/META-INF/spring/core-app-web-common-management-context.xml"/>
所以,不知何故@Fonent对DynamicNamingStrategy的扫描不起作用......
如果我在导出器中使用此属性定义,那么它可以工作:
<property name="namingStrategy"><bean class="com.a.b.c.management.DynamicNamingStrategy" /></property>
但我想了解为什么组件扫描机制在第一时间出现问题,显然我错过了一些东西。
此外,STS中的Spring Explorer视图也缺少该bean。启用对配置文件中元素的支持选项似乎没有什么区别。
答案 0 :(得分:1)
将.*
放在您的<context:component-scan>
元素base-package
属性中的包名末尾。我认为这会导致组件扫描查找名为*
的包,其中可能没有包(不能是一个)。
base-package就是基础包。 component-scan
将扫描所有基本软件包的所有子项,因此无需在软件包名称的末尾添加.*
通配符。