春季自动装配与独特的豆:春季预计单一匹配豆,但发现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冲突。

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...