`

用@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 }
复制代码
分享到:
评论

相关推荐

    Spring @Primary和@Qualifier注解原理解析

    "Spring @Primary和@Qualifier注解原理解析" 在Spring框架中,@Primary和@Qualifier注解是两个非常重要的注解,它们的主要...我们可以根据实际情况选择使用@Primary或者@Qualifier注解来解决bean注入时的歧义问题。

    如何正确使用 @Qualifier 注解来解决多个同类型 Bean 注入的问题

    使用 @Qualifier 注解是解决 Spring 中多个同类型 Bean 注入冲突的一种常见方法。当我们在 Spring 容器中存在多个同一接口或父类的实现时,如果不明确指定要注入哪个实现,Spring 就会抛出 "Consider marking one of...

    通过@Autowired注解注入bean的顺序,以及@bean注入.rar

    4. **@Qualifier注解**:如果还有多个bean,且没有`@Primary`,Spring会检查`@Autowired`注解是否带有`@Qualifier`,并根据指定的bean名称进一步筛选。 5. **索引**:如果以上方式都无法确定唯一bean,那么可以为...

    Spring_Qualifier_utilizando_Autowired.pdf_springqualifier_java_a

    本主题将深入探讨Spring框架中的`@Qualifier`注解,以及它如何与`@Autowired`配合使用,以实现更精确的依赖注入。 `@Autowired`是Spring框架的核心特性之一,它允许自动装配bean的依赖,无需显式地通过setter方法或...

    【Java面试】@Resource 和 @Autowired 的区别.doc

    @Autowired 如果需要支持 name 匹配,就需要配合 @Primary 或者 @Qualifier 来实现。 在实际开发中,我们可以根据需要选择合适的注解来实现依赖注入。例如,如果我们需要根据 Bean 的名字来实现依赖注入,那么 @...

    spring的annotation的autowired

    本篇文章将深入探讨`@Autowired`的使用、原理以及其在实际开发中的应用。 ### 1. `@Autowired` 注解介绍 `@Autowired`是Spring框架提供的一个注解,用于自动将依赖的Bean注入到当前Bean中。它可以根据类型或者通过...

    Spring使用@Autowired注解自动装配

    `@Qualifier`与`@Autowired`配合使用 当存在多个相同类型的bean时,Spring无法确定应该注入哪个。这时,可以使用`@Qualifier`注解来指定具体的bean。 ```java @Autowired @Qualifier("myServiceBean1") private ...

    Spring注解 - 52注解 - 原稿笔记

    注解包含: 拦截器 , 过滤器 , 序列化 , @After , @AfterReturning , @AfterThrowing , @annotation , @Around , @Aspect , @Autowired , @Bean , @Before , @Component , @ComponentScan , @ComponentScans , @...

    Spring自动装配@Qualifier实例

    `@Qualifier`可以与`@Autowired`一起使用,也可以单独使用。如果单独使用,`@Qualifier`需要配合`@Resource`注解,因为它不支持基于类型的自动装配。 除了`@Qualifier`,Spring还提供了其他的注解来处理多bean的...

    Spring@Autowired注解与自动装配.rar

    - **自动装配候选列表**:可以使用`@Autowired`注解的`@Qualifier`注解的`value`属性,提供一个bean的名称列表,Spring会尝试从列表中找到匹配的bean。 ### 4. 配置控制 - **@Autowired注解的可选性**:使用`...

    学习Spring笔记_Annotation(注解)_Autowired_Qualifier

    Spring的核心特性之一是使用注解来简化配置,其中`@Autowired`和`@Qualifier`是两个关键的注解,它们在自动装配Bean时发挥着重要作用。这篇学习Spring笔记将深入探讨这两个注解的用法、原理以及它们在实际开发中的...

    (转)Spring中@Autowired注解和@Resource注解的区别

    在实际应用中,通常推荐使用`@Autowired`,因为它提供了更强大的自动装配能力,包括基于类型、基于 Qualifier、基于父接口等多维度的注入方式。而`@Resource`更适合那些需要基于bean名称注入的场景,或者当你希望...

    Spring的Autowired自动装配(XML版本+Annotation版本+源码+解析)

    此外,还可以使用@Autowired注解的optional属性来处理可选依赖,避免因为找不到匹配bean导致的异常。 在Spring框架中,@Autowired不仅提供了方便的依赖注入,还与其他注解(如@Service、@Repository、@Component、@...

    spring autowired注解完整版

    3. **@Primary**:若无法通过 @Qualifier 解决冲突,可以使用 @Primary 注解标记一个 Bean 为主,当存在多个候选 Bean 时,Spring 会优先选择带有 @Primary 的 Bean 进行注入。 4. **@Autowired 的可选性**:使用 @...

    1.@Resource是按名称进行注入的,属于java自带的。@Autowired是按类型进行注入的,属于Spring。.pdf

    除了基于类型匹配外,`@Autowired`还支持基于方法参数的自动装配,以及配合`@Primary`注解处理多候选bean的情况。`@Primary`可以标记一个bean为首选bean,当出现多个匹配的候选bean时,Spring会优先选择带有`@...

    SSH笔记-通过@Autowired配置注入关系

    5. **方法注入**:同样的,你可以在setter方法或者任何带有参数的方法上使用`@Autowired`,Spring会在调用该方法时注入对应的依赖。 6. **注解与XML配置的结合**:在Spring 4中,`@Autowired`可以与XML配置一起使用...

    spring中Autowired和Qulifier注解

    在Spring框架中,`@Autowired`和`@Qualifier`注解是两个非常重要的依赖注入(Dependency Injection,简称DI)工具,它们帮助开发者管理并注入所需的Bean。本文将深入探讨这两个注解的工作原理、使用场景以及如何配合...

    Spring In Action 使用@Autowired 和@ Resource 自动装配Bean

    // 使用@Autowired的例子 @Service public class UserService { @Autowired private UserRepository userRepository; } // 使用@Resource的例子 @Service public class UserService { @Resource(name = ...

    Spring注解@Resource和@Autowired.doc

    如果同时在字段和 setter 方法上使用@Autowired,后者将会覆盖前者。@Autowired 按照类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置其 required 属性为 false。如果我们想使用按...

    Spring @Autowired

    在Java的Spring框架中,`@Autowired`是一个关键的依赖注入(Dependency Injection,简称DI)注解,它允许开发者自动装配Bean的依赖,无需手动设置属性或者调用构造函数。这个注解是Spring框架的核心特性之一,极大地...

Global site tag (gtag.js) - Google Analytics