春季自动装配与独特的豆:春季预计单一匹配豆,但发现2

我试图使用Spring for webapp自动连接一些bean(用于依赖注入)。一个控制器bean包含另一个bean,它又保存另一组bean的hashmap。现在地图上只有一个条目。当我在tomcat中运行并调用该服务时,我收到一条错误,指出第二个bean(控制器中保存)不是唯一的
No unique bean of type [com.hp.it.km.search.web.suggestion.SuggestionService] is defined: expected single matching bean but found 2: [suggestionService,SuggestionService]

我无法看到我在哪里定义这个bean两次,但是对于Spring和自动布线来说是新的,所以我可能会缺少一些基本的东西。下面列出的xml和2类的源代码…

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"     xmlns:context="http://www.springframework.org/schema/context"     xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
    http://www.springframework.org/schema/beans     
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<context:component-scan base-package="com.hp.it.km.search.web.suggestion" />
<mvc:annotation-driven />
<context:annotation-config />

<bean id="SuggestionController" class="com.hp.it.km.search.web.suggestion.SuggestionController">
    <property name="service">
        <ref bean="SuggestionService" />
    </property>
</bean>

<bean id="SuggestionService" class="com.hp.it.km.search.web.suggestion.SuggestionService">
    <property name="indexSearchers"> 
         <map>
            <entry key="KMSearcher"> <ref bean="KMSearcherBean"></ref></entry>
        </map>
    </property>
</bean>

<bean id="KMSearcherBean" class="com.hp.it.km.search.web.suggestion.SuggestionIndexSearcher">
      <constructor-arg index="0" value="KMSearcher" />
      <constructor-arg index="1" value="C://dev//workspace//search-restful-webapp//src//main//resources//indexes//keyword" />
</bean>

与自动连线控制器和服务bean的类屁股在这里…

@Controller
public class SuggestionController {
private SuggestionService service;

@Autowired
public void setService(SuggestionService service) {
    this.service = service;
}

public SuggestionService getService() {
    return service;
}

和…

@Component
public class SuggestionService {

private Map<String,IndexSearcher> indexSearchers = new HashMap<String,IndexSearcher>();

@Autowired
public void setIndexSearchers(Map<String,IndexSearcher> indexSearchers) {
    this.indexSearchers = indexSearchers;
}

    public SuggestionService() {
    super(); }

请帮忙!

问题是因为您有一个通过@Component注释创建的SuggestionService类型的bean,也是通过XML配置创建的。如JB Nizet所解释的,这将导致通过@Component创建一个名为“suggestionService”的bean,另一个通过XML创建名为“SuggestionService”的bean。

当您在控制器中引用@Autowired的SuggestionService时,默认情况下,Spring会自动导线“类型”,并找到两个类型为“SuggestionService”的bean

您可以执行以下操作

>从您的服务中删除@Component,并依赖于通过XML映射 – 最简单
>从XML中删除SuggestionService并自动连接依赖关系 – 使用util:map注入indexSearchers映射。
>使用@Resource而不是@Autowired来选择它的名称。

@Resource("suggestionService")
private SuggestionService service;

要么

@Resource("SuggestionService")
    private SuggestionService service;

两者都应该工作。第三个是肮脏的修复,最好通过其他方式解决bean冲突。

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...