【问题标题】:Spring context scanning behaviorSpring上下文扫描行为
【发布时间】:2013-04-04 13:42:18
【问题描述】:

我得到以下信息:

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中),在上面的component-scan中引用,如下

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"/>

所以,不知何故,对 DynamicNamingStrategy 的@Component 扫描不起作用...

如果我改为在导出器中使用此属性定义,那么它可以工作:

<property name="namingStrategy"><bean class="com.a.b.c.management.DynamicNamingStrategy" /></property>

但我想了解为什么组件扫描机制一开始就动摇了,显然我遗漏了一些东西。

此外,STS 中的 Spring Explorer 视图也缺少该 bean。启用对配置文件中元素的支持选项似乎没有什么不同。

【问题讨论】:

    标签: spring annotations


    【解决方案1】:

    在您的 &lt;context:component-scan&gt; 元素 base-package 属性中删除包名称末尾的 .*。我认为这会导致组件扫描查找名为 * 的包,但可能没有(不可能有)。

    基本包就是这样,基本包。 component-scan 将扫描所有基础包的所有子包,因此不需要在包名称末尾添加 .* 通配符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-25
      • 2010-12-17
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 2014-12-26
      • 1970-01-01
      • 2018-04-01
      相关资源
      最近更新 更多