Spring处理自动装配的歧义性

原创 2018年04月17日 09:21:01

Spring自动装配Bean的歧义性:

        自动装配Bean能够提供很大的帮助,因为它会减少装配应用程序组件时所需要的显示配置的数量.不过,仅有一个bean匹配所需的结果时,自动装配才是有效的.如果有不止一个bean能够匹配结果的话,这种歧义性会阻碍Spring自动装配属性,构造器参数或方法参数.

        假设有如下Setter方法:

    @Autowired
    public void setDessert(Dessert dessert){
        this.dessert = dessert;
    }
        Dessert是一个接口,有三个类实现了这个接口:
@Component
public class Cake implements Dessert{
    
}
@Component
public class Cookie implements Dessert{

}
@Component
public class IceCream implements Dessert{
    
}

        这三个实现类均使用了@Component注解,因此自动扫描时都能被Spring在应用上下文自动创建bean;然而,当Spring试图自动装配setDessert()中的参数时,它并没有唯一的,无歧义的可选值.这时,Spring会抛出NoUniqueBeanDefinitionException.


标示首选的Bean:

@Component
@Primary
public class Cake implements Dessert{
    
}
@Component
public class Cookie implements Dessert{

}
@Component
public class IceCream implements Dessert{
    
}

        如上,可以通过@Primary来标示Spring遇到有歧义性的Bean装配时应该选择那个Bean去装配.

        但如果多个bean被@Primary注解修饰,那将还是会有歧义性存在,幸好,Spring的限定符机制解决了这个问题.


限定自动装配的bean:

        @Qualifier注解是使用限定符的主要方式.它可以和@Autowired协同使用,在注入的时候制定想要注入进去的时候时哪一个.例如,确保Icecream注入到setDessert()之中:

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

        这是使用限定符最简单的例子.为@Qualifier注解所设置的参数就是想要注入的bean的ID.


创建自定义的限定符:

        可以为bean设置自己的限定符,而不是依赖于将beanID作为限定符:

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

        这时cold限定符分配个了IceCream bean.

        当通过Java配置显示定义bean的时候,@Qualifier可以与@Bean注解一起使用.


使用自定义的限定符注解:

    @Autowired
    @Qualifier("cold")
    public void setDessert(Dessert dessert){
        this.dessert = dessert;
    }
        这样就可以定位到我们想要的bean.但是当有多个被cold标注的bean时,Java也不允许对同一个类使用多个相同的注解,这时可以自定义限定符注解:
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Cold {}
@Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Creamy {}
        现在可以重新对IceCream进行注解了:
@Component
@Cold
@Creamy
public class IceCream implements Dessert{
    
}
        最后在注入点,可以使用必要的限定符注解进行组合:
    @Autowired
    @Cold
    @Creamy
    public void setDessert(Dessert dessert){
        this.dessert = dessert;
    }
        通过声明自定义的限定符注解,可以同时使用多个限定符.


                



spring--bean自动装配的歧义性

在之前的博客中,我曾经提到过当spring自动装配bean时,有可能会遇到这样的情况,有多个bean符合条件,那么spring就会抛出异常,这篇博客,我们就来学习一下怎么样解决这个问题. 1. 例子 ...
  • xingtingshu
  • xingtingshu
  • 2016-08-22 13:46:10
  • 307

Spring学习笔记之处理自动装配的歧义性

之前的文章中已经看到了Spring的自动装配有很大的用处,它可以帮助我们快速的装配bean,但是这里存在一个问题,在之前的装配中,仅有一个bean匹配所需的结果时,自动装配才是有效的。如果不仅只有一个...
  • huzhanfei
  • huzhanfei
  • 2016-10-20 17:23:41
  • 279

spring处理自动装配的歧义性

问题场景:spring创建一个Bean需要它是唯一的、没有歧义的,所以当歧义产生时会报错:NoUniqueBeanDefinitionException。 使用@Primary注解 添加了@Pr...
  • shuiCSDN
  • shuiCSDN
  • 2017-02-28 21:59:50
  • 223

处理自动装配的歧义性

spring的自动装备Autowired默认是根据类型查找的,如果有俩个同类型的bean,则会出现异常。此时有俩种方法解决: 1:设置首选bean,在声明bean的同时声明为首选bean, ...
  • u011545613
  • u011545613
  • 2017-06-02 08:33:48
  • 68

十四、处理自动装配的歧义性

自动装配能够提供很大的帮助,她会减少应用程序组件的所需要的显式配置的数量。不过,仅有一个bean匹配所需的结果式,自动装配才是有效的。如果不仅有一个bean能够匹配结果的话,这种歧义性会阻碍Sprin...
  • L_Sail
  • L_Sail
  • 2017-05-02 22:23:33
  • 78

Spring-处理自动装配的歧义性

自动装配可以对依赖注入提供很大帮助,因为它会减少装配应用程序组件时所需的显式装配的数量。 不过,仅有一个bean匹配所需的结果时,自动装配才是有效的。如果不仅有一个bean能够匹配的话,这种歧义性会阻...
  • Young4Dream
  • Young4Dream
  • 2016-11-30 20:27:13
  • 111

处理Spring使用@Autowired自动装配的歧义性

@Autowired默认使用的是byType的方式注入,@Qualifier则是使用byName的方式阐述自动装配的歧义性,假设使用@Autowired注解标注了setDessert()方法:@Aut...
  • qq_34999633
  • qq_34999633
  • 2018-04-23 19:20:05
  • 4

Spring基础处理-自动装配的歧义性

1.出现歧义性的原因 当自动装配的多个bean,同时继承同一个接口的时候,使用@Autowired注解对接口进行bean的注入,会出现歧义性.如: @Autowired public void...
  • Pruett
  • Pruett
  • 2018-01-20 12:07:43
  • 74

《spring in action》--处理自动装配的歧义性

自动装配的歧义性在spring实现自动装配依赖的过程中,一个bean所依赖的另一个bean,必须有且仅有一个与之匹配,自动装配才是有效的。如果在spring容器中找到多个与之匹配的bean,则会抛出N...
  • m0_37282976
  • m0_37282976
  • 2017-12-29 12:15:40
  • 24
收藏助手
不良信息举报
您举报文章:Spring处理自动装配的歧义性
举报原因:
原因补充:

(最多只允许输入30个字)