• spring in action 学习笔记八:用@Primary 或者@Qualifier消除@Autowired引起的歧义现象


      首先解释一下@Primary和@Qualifier这两个注解的意思:@Primary的意思是在众多相同的bean中,优先使用用@Primary注解的bean.而@Qualifier这个注解则指定某个bean有没有资格进行注入。

    示例代码的思路是:1.一个接口Dessert和这个接口的三个实现类,2.再在一个类(AbrahamLincoln)中自动注入Dessert这个接口,3.用自动扫描机制自动创建bean.

    如果不用@Primary和@Qualifier注解,势必出现如下错误:NoUniqueBeanDefinitionException.

      示例代码如下:【用@Primary来解决问题】

    Dessert接口的代码如下:

     1 package com.advancedWiring.ambiguityInAutowiring;
     2 
     3 import org.springframework.stereotype.Component;
     4 
     5 /**
     6  * Created by ${秦林森} on 2017/6/9.
     7  */
     8 @Component
     9 public interface Dessert {
    10     void amI();
    11 }

    Cake的代码如下:

     1 package com.advancedWiring.ambiguityInAutowiring;
     2 
     3 import org.springframework.beans.factory.annotation.Qualifier;
     4 import org.springframework.context.annotation.Primary;
     5 import org.springframework.stereotype.Component;
     6 
     7 /**
     8  * Created by ${秦林森} on 2017/6/9.
     9  */
    10 @Component
    11 public class Cake implements Dessert {
    12     @Override
    13     public void amI() {
    14         System.out.println("I am cake");
    15     }
    16 }

    Cookie的代码如下:

    package com.advancedWiring.ambiguityInAutowiring;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Primary;
    import org.springframework.stereotype.Component;
    
    
    /**
     * Created by ${秦林森} on 2017/6/9.
     */
    @Component
    public class Cookie implements Dessert {
        @Override
        public void amI() {
            System.out.println("I am cookie");
        }
    }

    IceCream的代码如下:

    package com.advancedWiring.ambiguityInAutowiring;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.context.annotation.Primary;
    import org.springframework.stereotype.Component;
    
    
    /**
     * Created by ${秦林森} on 2017/6/9.
     */
    @Component
    @Primary//注意这里用了@Primary这个注解。
    public class IceCream implements  Dessert{
        @Override
        public void amI() {
            System.out.println("I am ice cream");
        }
    }

    DessertConfig的代码如下:

     1 package com.advancedWiring.ambiguityInAutowiring;
     2 
     3 import org.springframework.context.annotation.ComponentScan;
     4 import org.springframework.context.annotation.Configuration;
     5 
     6 /**
     7  * Created by ${秦林森} on 2017/6/9.
     8  */
     9 @Configuration
    10 /**
    11  * 用@ComponentScan自动扫描创建bean
    12  */
    13 @ComponentScan(basePackageClasses = Dessert.class)
    14 public class DessertConfig {
    15 
    16 }

    测试类的代码如下:

     1 package com.advancedWiring.ambiguityInAutowiring;
     2 
     3 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
     4 
     5 /**
     6  * Created by ${秦林森} on 2017/6/9.
     7  */
     8 public class AmbiguityTest {
     9     public static void main(String[] args) {
    10         AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(DessertConfig.class);
    11         Dessert dessert = ac.getBean(Dessert.class);
    12         dessert.amI();
    13     }
    14 }

     二:用@Qualifier这个注解来解决问题:

    核心代码如下:

     1 package com.advancedWiring.ambiguityInAutowiring;
     2 
     3 import org.springframework.beans.factory.annotation.Qualifier;
     4 import org.springframework.context.annotation.Primary;
     5 import org.springframework.stereotype.Component;
     6 
     7 
     8 /**
     9  * Created by ${秦林森} on 2017/6/9.
    10  */
    11 @Component
    12 @Qualifier("crispy")
    13 public class Cookie implements Dessert {
    14     @Override
    15     public void amI() {
    16         System.out.println("I am cookie");
    17     }
    18 }
     1 package com.advancedWiring.ambiguityInAutowiring;
     2 
     3 import org.springframework.beans.factory.annotation.Autowired;
     4 import org.springframework.beans.factory.annotation.Qualifier;
     5 import org.springframework.stereotype.Component;
     6 
     7 /**
     8  * Created by ${秦林森} on 2017/6/9.
     9  */
    10 @Component
    11 public class AbrahamLincoln {
    12     private Dessert dessert;
    13 
    14     public Dessert getDessert() {
    15         return dessert;
    16     }
    17     @Autowired
    18     @Qualifier("crispy")
    19     public void setDessert(Dessert dessert) {
    20         this.dessert = dessert;
    21     }
    22 }
  • 相关阅读:
    HDU1312 ZOJ2165 Red and Black
    HDU1312 ZOJ2165 Red and Black
    HDU1181 变形课【DFS】
    codevs1017 乘积最大
    codevs1220 数字三角形
    codevs1169 传纸条
    codevs1219 骑士游历
    codevs1010 过河卒
    codevs1166 矩阵取数游戏
    codevs1154 能量项链
  • 原文地址:https://www.cnblogs.com/1540340840qls/p/6970692.html
Copyright © 2020-2023  润新知