首先解释一下@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注解是两个非常重要的注解,它们的主要...我们可以根据实际情况选择使用@Primary或者@Qualifier注解来解决bean注入时的歧义问题。
使用 @Qualifier 注解是解决 Spring 中多个同类型 Bean 注入冲突的一种常见方法。当我们在 Spring 容器中存在多个同一接口或父类的实现时,如果不明确指定要注入哪个实现,Spring 就会抛出 "Consider marking one of...
4. **@Qualifier注解**:如果还有多个bean,且没有`@Primary`,Spring会检查`@Autowired`注解是否带有`@Qualifier`,并根据指定的bean名称进一步筛选。 5. **索引**:如果以上方式都无法确定唯一bean,那么可以为...
本主题将深入探讨Spring框架中的`@Qualifier`注解,以及它如何与`@Autowired`配合使用,以实现更精确的依赖注入。 `@Autowired`是Spring框架的核心特性之一,它允许自动装配bean的依赖,无需显式地通过setter方法或...
@Autowired 如果需要支持 name 匹配,就需要配合 @Primary 或者 @Qualifier 来实现。 在实际开发中,我们可以根据需要选择合适的注解来实现依赖注入。例如,如果我们需要根据 Bean 的名字来实现依赖注入,那么 @...
本篇文章将深入探讨`@Autowired`的使用、原理以及其在实际开发中的应用。 ### 1. `@Autowired` 注解介绍 `@Autowired`是Spring框架提供的一个注解,用于自动将依赖的Bean注入到当前Bean中。它可以根据类型或者通过...
`@Qualifier`与`@Autowired`配合使用 当存在多个相同类型的bean时,Spring无法确定应该注入哪个。这时,可以使用`@Qualifier`注解来指定具体的bean。 ```java @Autowired @Qualifier("myServiceBean1") private ...
注解包含: 拦截器 , 过滤器 , 序列化 , @After , @AfterReturning , @AfterThrowing , @annotation , @Around , @Aspect , @Autowired , @Bean , @Before , @Component , @ComponentScan , @ComponentScans , @...
`@Qualifier`可以与`@Autowired`一起使用,也可以单独使用。如果单独使用,`@Qualifier`需要配合`@Resource`注解,因为它不支持基于类型的自动装配。 除了`@Qualifier`,Spring还提供了其他的注解来处理多bean的...
- **自动装配候选列表**:可以使用`@Autowired`注解的`@Qualifier`注解的`value`属性,提供一个bean的名称列表,Spring会尝试从列表中找到匹配的bean。 ### 4. 配置控制 - **@Autowired注解的可选性**:使用`...
Spring的核心特性之一是使用注解来简化配置,其中`@Autowired`和`@Qualifier`是两个关键的注解,它们在自动装配Bean时发挥着重要作用。这篇学习Spring笔记将深入探讨这两个注解的用法、原理以及它们在实际开发中的...
在实际应用中,通常推荐使用`@Autowired`,因为它提供了更强大的自动装配能力,包括基于类型、基于 Qualifier、基于父接口等多维度的注入方式。而`@Resource`更适合那些需要基于bean名称注入的场景,或者当你希望...
此外,还可以使用@Autowired注解的optional属性来处理可选依赖,避免因为找不到匹配bean导致的异常。 在Spring框架中,@Autowired不仅提供了方便的依赖注入,还与其他注解(如@Service、@Repository、@Component、@...
3. **@Primary**:若无法通过 @Qualifier 解决冲突,可以使用 @Primary 注解标记一个 Bean 为主,当存在多个候选 Bean 时,Spring 会优先选择带有 @Primary 的 Bean 进行注入。 4. **@Autowired 的可选性**:使用 @...
除了基于类型匹配外,`@Autowired`还支持基于方法参数的自动装配,以及配合`@Primary`注解处理多候选bean的情况。`@Primary`可以标记一个bean为首选bean,当出现多个匹配的候选bean时,Spring会优先选择带有`@...
5. **方法注入**:同样的,你可以在setter方法或者任何带有参数的方法上使用`@Autowired`,Spring会在调用该方法时注入对应的依赖。 6. **注解与XML配置的结合**:在Spring 4中,`@Autowired`可以与XML配置一起使用...
在Spring框架中,`@Autowired`和`@Qualifier`注解是两个非常重要的依赖注入(Dependency Injection,简称DI)工具,它们帮助开发者管理并注入所需的Bean。本文将深入探讨这两个注解的工作原理、使用场景以及如何配合...
// 使用@Autowired的例子 @Service public class UserService { @Autowired private UserRepository userRepository; } // 使用@Resource的例子 @Service public class UserService { @Resource(name = ...
如果同时在字段和 setter 方法上使用@Autowired,后者将会覆盖前者。@Autowired 按照类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许 null 值,可以设置其 required 属性为 false。如果我们想使用按...
在Java的Spring框架中,`@Autowired`是一个关键的依赖注入(Dependency Injection,简称DI)注解,它允许开发者自动装配Bean的依赖,无需手动设置属性或者调用构造函数。这个注解是Spring框架的核心特性之一,极大地...