自动装配可以对依赖注入提供很大帮助,因为它会减少装配应用程序组件时所需的显式装配的数量。

不过,仅有一个bean匹配所需的结果时,自动装配才是有效的。如果不仅有一个bean能够匹配的话,这种歧义性会阻碍Spring自动装配属性,构造器参数或方法参数。但是,当确实发生歧义性时,Spring提供了多种可选方案来解决这样的问题。你可以将可选bean中的某一个设为首选(primary)的bean,或者使用限定符(qualifier)来帮助Spring将可选的bean的范围缩小到只有一个bean。

javaConfig模式:

  • 隐式

     @Component
    @Primary
    public class VCDPlayer implements MediaPlayer{...}
  • 显式

     public class MagicBean {
    @Bean//显式声明一个bean,id默认为方法名
    @Primary
    public MagicBean magicBean(){
    return new MagicBean();
    }
    }

xml模式:

<bean id="cDPlayer" class="soundSystem.CDPlayer" primary="true"></bean>

然而,如果有两个继承相同接口的类同时设置primary,则仍然会有歧义,因此引入Qualifier。Qualifier注解是使用限定符的主要方式,它可以与@AutoWired和@Inject协同使用,在注入的时候指定想要注入进去的是哪个bean。例如我们想要确保要将IceCream注入到SetDessert()中:

 @AutoWired
@Qualifier("iceCream")
public void setDessert(Dessert dessert){
this.dessert =dessert;
}

这里所设置的参数就是想要注入bean的ID。所有使用@Component注解声明的类都会创建为bean,并且bean的ID为首字母变为小写的类名,因此@Qualifier("iceCream")指向的是组件扫描时所创建的bean并且这个bean是IceCream类的实例。

但是,字符串类型的参数是不安全的,如果修改类名,这里也会受到影响,所以我们需要创建自定义的限定符,所需要做的仅仅是在IceCream类上面添加@Qualifier("cold"):

 @Component
@Qualifier("cold")
public class IceCream implements Dessert{...}

或者在显式模式中:

 @Bean
@Qualifier("cold")
public Dessert iceCream(){
return new IceCream();
}

相应的setter方法上也将参数设置为cold即可。

可是,如果有另外一个bean也同样使用了cold限定符呢,还是会出现歧义,而java不允许同一个条目上重复出现相同类型的多个注解,否则编译器会报错,所以我们需要创建自定义的限定符注解,借助这样的注解来表达bean所希望限定的特性。

 package com.myapp;

 import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; import org.springframework.beans.factory.annotation.Qualifier; @Target({ElementType.CONSTRUCTOR,ElementType.FIELD,ElementType.METHOD,ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Cold {}

这样我们就创建好了一个叫Cold的注解,在其类上添加,即可作为它的一个限定符注解:

 @Component
@Cold
public class IceCream implements Dessert{...}

这样就可以多次添加限定条件,以使得最终限定到符合条件的bean只有一个。榆次同时,相对于使用原始的@Qualifier并借助String类型来指定限定符,自定义的注解也更为类型安全。

Spring-处理自动装配的歧义性的更多相关文章

  1. Spring处理自动装配的歧义性

    1.标识首选的bean 2.使用限定符@Qualifier 首先在bean的声明上添加@Qualifier 注解: @Component @Qualifier("cdtest") ...

  2. Spring实战之处理自动装配的歧义性

    仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不仅有一个bean能够匹配结果的话,这种歧义性会阻碍Spring自动装配属性.构造器参数或方法参数.为了阐述自动装配的歧义性,假设我们使用@A ...

  3. Spring入门(八):自动装配的歧义性

    1. 什么是自动装配的歧义性? 在Spring中,装配bean有以下3种方式: 自动装配 Java配置 xml配置 在这3种方式中,自动装配为我们带来了很大的便利,大大的降低了我们需要手动装配bean ...

  4. spring装配---处理自动装配的歧义性

    一.歧义性 当我们使用spring的注解进行自动装配bean时,如果不仅有一个bean能够匹配结果的话,会抛出NoUniqueBeanDefinitionException: 例如本例中 当sprin ...

  5. spring学习总结——高级装配学习二(处理自动装配的歧义性)

    我们已经看到如何使用自动装配让Spring完全负责将bean引用注入到构造参数和属性中.自动装配能够提供很大的帮助.不过,spring容器中仅有一个bean匹配所需的结果时,自动装配才是有效的.如果不 ...

  6. Spring实战(六)自动装配的歧义性

    1.Spring进行自动装配时碰到的bean歧义性问题. 在进行自动装配时,只有仅有一个bean匹配所需结果时,才是可行的. 如果不仅仅一个bean能够匹配结果,例如一个接口有多个实现,这种歧义性会阻 ...

  7. SpringInAction--Bean自动装配的歧义性处理

    在前面,学习如何装配Bean的时候,或许会发现,有的同类型的Bean智能配置一个 如下: package com.bean.java; import org.springframework.conte ...

  8. Spring的自动装配与依赖注入

    Spring的自动装配与依赖注入 装配 = 创建Bean + 注入Bean 创建Bean 自动发现 显式注册Bean 注入Bean 基于配置的注入 自动注入 Spring的装配分为显式装配和隐式装配, ...

  9. Spring的自动装配Bean

    spring的自动装配功能的定义:无须在Spring配置文件中描述javaBean之间的依赖关系(如配置<property>.<constructor-arg>).IOC容器会 ...

随机推荐

  1. Java 并发

    参考:http://www.cnblogs.com/dolphin0520/category/602384.html

  2. android获取对话框文本注意事项

    1.View注意设置成final类型如final View layout=.. . 2.获取文本框对象时候格式EditText e = (EditText)layout.findViewById(R. ...

  3. iOS_20_微博Dock的尾随切换

    终于效果图:Dock尾随HomeVC一起切换 要求: 当点击HomeVC里面的微博列表的某一行时候, push到StatusDetail微博详情控制器,而且Dock也一起消失 当点击StatusDet ...

  4. cocos2d-x笔记 ccTouchesBegan、ccTouchesMoved、ccTouchesEnded

    #ifndef __MUTITOUCHTEST_H__ #define __MUTITOUCHTEST_H__ #include "../testBasic.h" class Mu ...

  5. SqlServer 如何知道是否发生了索引碎片

    --如何知道是否发生了索引碎片 SELECT object_name(dt.object_id) Tablename,si.name IndexName,dt.avg_fragmentation_in ...

  6. C++11 容器Array

    array是一个固定大小的顺序容器,不能动态改变大小,array内的元素在内存中以严格的线性顺序存储与普通数组声明存储空间大小[]的方式是一样有效的,只是加入了一些成员函数和全局函数[get (arr ...

  7. IOC疑惑

    转载自:http://www.tuicool.com/articles/QfeEFn 大家好. 今天我来给大家扯扯IoC,以及StructureMap的一些简单应用(基本用法.自动装配.生命周期.延迟 ...

  8. PeekMessage、GetMessage的区别

    在Windows编程中经常使用这两个函数来处理消息,它们之间的区别就是GetMessage是阻塞的,PeekMessage是非阻塞的. GetMessage原型如下:BOOL GetMessage(L ...

  9. 7款基于jquery的动画搜索框

    无论是电商网站,还是媒体网,还是个人博客,每个网站都有属于自己个性化的搜索框.今天小编给大家带来7款基于jquery的动画搜索框.每个搜索框都采用了动画效果,一起看下效果图吧. 在线预览   源码下载 ...

  10. 简易web项目jdbcUtil

    jdbc.username=root jdbc.password=root jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://mini1: ...