本帖最后由 lifeiscool 于 2009-09-15 16:25:08 编辑

解决方案 »

  1.   

    帮你顶了···虽然最近也学spring,但感觉一头雾水,啥也不懂耶
      

  2.   

    @Autowired 是按 byType 自动注入,如果想 byName ,可以使用 @Qualifier
    @Resource 默认按 byName 自动注入,只是它是由 JSR-250 规范定义的注释@Autowired
    @Qualifier("beanName")使用注入后,就不用再 setter/getter 了至于 LZ 说的那个问题,你真的了解了 什么是 byType , 什么是 byName 了吗 ?
      

  3.   

    不是很了解  byType是按类型到spring配置文件里找 byName是按名称到配置文件里找
    这个可以小试一下 就几句代码.. 
    按照我的代码应该是会报错,因为有2个相同的类型,结果去输出了结果。。
    不解..
      

  4.   

    把office配置换哈 看看是不是002
    呵呵!
      

  5.   

    楼主还是不理解spring ,建议多看看文档!
      @Autowired(默认按类型查找,若没有查到  不会再去用名称查找)byType 按照类型装配 可以根据属性类型 在容器中寻找跟该类型匹配的bean如果发现多个会抛出异常 如果没有找到属性值设置为nullbyName 按照名称装配 根据属性名称 在容器中寻找该属性名称相同的bean 如果找不到 属性值为null  既然是注解  set get 应去掉
    <   按照我的代码应该是会报错,因为有2个相同的类型,结果去输出了结果。。 >
      只要bean id 不相等  一个实现类  可以写多个  
      

  6.   

    tO:6楼,"只要bean id 不相等  一个实现类  可以写多个 "
    你说错了吧。你跑了楼主的程序没? 我刚刚跑了下,按楼主的程序我的确实异常了:
    Could not autowire field: private fiona.apple.Office fiona.apple.Boss.office; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [fiona.apple.Office] is defined: expected single matching bean but found 2: [office, office2]但如果我把xml文件中的任意一个office的定义注释掉,就不会有问题了。所以楼主的理解还是正确的,@Autowired是按类型装配的,如果xml文件中有多个相同类型的定义,会出异常。
      

  7.   

    @Autowired默认byType,不用怀疑。
    如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出 BeanCreationException 异常。
    但请记住,此时仍然是byType!如楼上所说的那样。这时候如果结合使用@Qualifier,就会消除这种歧义,且自动注入的策略就从 byType 转变成 byName 了。如: @Autowired      
    public void setOffice(@Qualifier("office")Office office) {       
        this.office = office;       
    }
    注:@Autowired 可以对成员变量、方法以及构造函数进行注释,而 @Qualifier 的标注对象是成员变量、方法入参、构造函数入参。
      

  8.   

    确实,如果存在多个相同类型的Bean定义,首先会按byName进行匹配,如果两个相同类型的Bean按byName进行匹配失败的话,会抛出找到多个相同类型Bean定义的异常。