`
bjmike
  • 浏览: 283032 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring @Qualifier-转

阅读更多
当候选 Bean 数目不为 1 时的应对方法

在默认情况下使用

@Autowired

注释进行自动注入时,Spring 容器中匹配的候选 Bean 数目必须有且仅有一个。当找不到一个匹配的 Bean 时,Spring 容器将抛出

BeanCreationException

异常,并指出必须至少拥有一个匹配的 Bean。我们可以来做一个实验:

清单 10. 候选 Bean 数目为 0 时

<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd "> <bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor"/> <bean id="boss" class="com.baobaotao.Boss"/> <!-- 将 office Bean 注释掉 --> <!-- <bean id="office" class="com.baobaotao.Office"> <property name="officeNo" value="001"/> </bean>--> <bean id="car" class="com.baobaotao.Car" scope="singleton"> <property name="brand" value=" 红旗 CA72"/> <property name="price" value="2000"/> </bean></beans>

由于

office

Bean 被注释掉了,所以 Spring 容器中将没有类型为

Office

的 Bean 了,而 Boss 的

office

属性标注了

@Autowired

,当启动 Spring 容器时,异常就产生了。

当不能确定 Spring 容器中一定拥有某个类的 Bean 时,可以在需要自动注入该类 Bean 的地方可以使用

@Autowired(required = false)

,这等于告诉 Spring:在找不到匹配 Bean 时也不报错。来看一下具体的例子:

清单 11. 使用 @Autowired(required = false)

package com.baobaotao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Required;public class Boss { private Car car; private Office office; @Autowired public void setCar(Car car) { this.car = car; } @Autowired(required = false) public void setOffice(Office office) { this.office = office; } …}

当然,一般情况下,使用

@Autowired

的地方都是需要注入 Bean 的,使用了自动注入而又允许不注入的情况一般仅会在开发期或测试期碰到(如为了快速启动 Spring 容器,仅引入一些模块的 Spring 配置文件),所以

@Autowired(required = false)

会很少用到。

和找不到一个类型匹配 Bean 相反的一个错误是:如果 Spring 容器中拥有多个候选 Bean,Spring 容器在启动时也会抛出

BeanCreationException

异常。来看下面的例子:

清单 12. 在 beans.xml 中配置两个 Office 类型的 Bean

… <bean id="office" class="com.baobaotao.Office"> <property name="officeNo" value="001"/></bean><bean id="office2" class="com.baobaotao.Office"> <property name="officeNo" value="001"/></bean>…

我们在 Spring 容器中配置了两个类型为

Office

类型的 Bean,当对 Boss 的

office

成员变量进行自动注入时,Spring 容器将无法确定到底要用哪一个 Bean,因此异常发生了。

Spring 允许我们通过

@Qualifier

注释指定注入 Bean 的名称,这样歧义就消除了,可以通过下面的方法解决异常:

清单 13. 使用 @Qualifier 注释指定注入 Bean 的名称

@Autowiredpublic void setOffice(@Qualifier("office")Office office) { this.office = office;}

@Qualifier("office")

中的

office

是 Bean 的名称,所以

@Autowired



@Qualifier

结合使用时,自动注入的策略就从 byType 转变成 byName 了。

@Autowired

可以对成员变量、方法以及构造函数进行注释,而

@Qualifier

的标注对象是成员变量、方法入参、构造函数入参。正是由于注释对象的不同,所以 Spring 不将

@Autowired



@Qualifier

统一成一个注释类。下面是对成员变量和构造函数入参进行注释的代码:

对成员变量进行注释:

清单 14. 对成员变量使用 @Qualifier 注释

public class Boss { @Autowired private Car car; @Autowired @Qualifier("office") private Office office; …}

对构造函数入参进行注释:

清单 15. 对构造函数变量使用 @Qualifier 注释

public class Boss { private Car car; private Office office; @Autowired public Boss(Car car , @Qualifier("office")Office office){ this.car = car; this.office = office ; }}

@Qualifier

只能和

@Autowired

结合使用,是对

@Autowired

有益的补充。一般来讲,

@Qualifier

对方法签名中入参进行注释会降低代码的可读性,而对成员变量注释则相对好一些。
分享到:
评论

相关推荐

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

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

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

    "Spring @Primary和@Qualifier注解原理解析" 在Spring框架中,@Primary和@Qualifier注解是两个非常重要的注解,它们的主要作用是消除bean注入时的歧义,能够让Spring容器知道加载哪个bean。本文将通过示例代码详细...

    Spring自动装配@Qualifier实例

    在上面的例子中,`@Qualifier("serviceA")`告诉Spring我们要注入的是名称为"serviceA"的bean,这样就可以避免注入错误的bean。 `@Qualifier`可以与`@Autowired`一起使用,也可以单独使用。如果单独使用,`@...

    spring-framework-4.1.9.RELEASE

    4.1.9.RELEASE版本中,对依赖注入的处理更加精细,支持了更多类型的注解,如`@Autowired`、`@Qualifier`等,使得依赖关系的配置更为简洁。 2. **AOP**:AOP允许开发者定义“横切关注点”,如日志、事务管理等,这些...

    Spring Boot使用spring-data-jpa配置Mysql多数据源

    在Spring Boot应用中,使用`spring-data-jpa`来配置MySQL多数据源是一项常见的需求,尤其是在构建大型分布式系统时,为了实现数据隔离、负载均衡或读写分离等目的。本教程将详细介绍如何在Spring Boot项目中配置多个...

    Spring @compenent注解详解

    在Spring框架中,`@Component`注解是核心的组件注解之一,它标志着一个类作为Spring IoC容器中的Bean。这个注解及其派生注解(如`@Service`、`@Repository`和`@Controller`)是Spring依赖注入(Dependency Injection...

    spring-framework-2.5.6

    例如,@Autowired、@Qualifier等注解,可以在不写XML的情况下实现bean的自动装配和精确匹配。 二、AOP(Aspect Oriented Programming)面向切面编程 Spring的AOP模块允许开发者定义横切关注点,如日志、事务管理等...

    官方原版spring-framework-5.0.5.RELEASE.rar

    - **依赖注入**:掌握如何使用@Autowired、@Qualifier等注解进行依赖注入,提高代码可测试性。 - **单元测试**:学习如何利用Spring Test框架编写单元测试和集成测试,确保代码质量。 - **安全控制**:使用Spring...

    spring-framework-2.0-m1-with-dependencies.rar

    1. **改进的DI**:引入了基于注解的依赖注入,允许在类或方法级别使用`@Autowired`和`@Qualifier`注解,简化了配置。 2. **AOP增强**:支持更多的切面类型,如注解驱动的切面,以及更灵活的切入点表达式。 3. **...

    spring-framework-4.0.2.RELEASE官方完整包加官方文档

    在4.0.2.RELEASE中,DI的实现更加完善,支持注解驱动的配置,如@Autowired和@Qualifier,简化了XML配置。 其次,Spring的AOP(面向切面编程)模块允许开发者定义“切面”,即关注点的分离。例如,事务管理、日志...

    spring-autowire-demo.zip

    使用`@Autowired`注解并配合`@Qualifier`注解的名称参数,Spring会查找具有相同名称的bean来注入。例如,如果你有一个名为`dataSource`的bean,你可以在需要注入的地方使用`@Autowired`和`@Qualifier("dataSource")...

    Spring_Qualifier_utilizando_Autowired.pdf_springqualifier_java_a

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

    官方spring-framework-5.0.3.RELEASE完整包

    在5.0.3.RELEASE中,DI机制更加成熟,支持注解驱动的配置,例如`@Autowired`和`@Qualifier`。 2. **Spring MVC**: 作为Spring的Web开发模块,Spring MVC提供了模型-视图-控制器架构,允许开发者创建高度可重用的...

    spring-framework-2.5.6-with-dependencies

    1. **依赖注入增强**:在2.5.6版本中,Spring对依赖注入进行了优化,支持了基于注解的配置,如@Autowired、@Qualifier等,使得代码更简洁。 2. **XML配置简化**:引入了Namespace,比如 `&lt;context:component-scan&gt;`...

    spring-framework-4.3.15.RELEASE官方完整包加官方文档

    2. 使用@Autowired自动装配bean,配合@Qualifier进行精细化控制。 3. 实现基于HTTP的RESTful服务,利用@RequestMapping、@GetMapping、@PostMapping等处理HTTP请求。 4. 利用Spring Data JPA简化数据库操作,通过...

    spring-framework-2.5.4

    此外,这个版本也支持基于注解的 DI,如 `@Autowired` 和 `@Qualifier`,使代码更加简洁。 其次,Spring 提供了面向切面编程(Aspect-Oriented Programming,AOP),这是一个强大的设计模式,用于处理系统中的横切...

    spring-framework-4.3.7.RELEASE-dist.7z

    2. **利用@Autowired的@Qualifier注解**:当存在多个相同类型的Bean时,使用@Qualifier指定具体的依赖。 3. **使用AOP进行事务管理**:通过声明式事务管理,可以避免代码中显式的事务控制。 4. **测试驱动开发**:...

    spring-framework-4.2.3.RELEASE

    4.2.3.RELEASE版本在DI方面进行了优化,使得配置更加简洁,支持了更多的注解驱动,如`@Autowired`、`@Qualifier`等,使得代码更加清晰易读。 其次,Spring的AOP(面向切面编程)模块在4.2.3.RELEASE中也有所增强,...

    spring-framework-3.2.1.RELEASE

    例如,`@Autowired`注解可以自动匹配并注入相应的bean,而`@Qualifier`则用于指定特定的bean。 2. **AOP**:AOP在Spring中主要用于实现日志记录、事务管理等横切关注点。3.2.1.RELEASE版本对AOP的支持更加完善,...

    spring-framework-2.0.8.zip

    同时,注解如 @Autowired 和 @Qualifier 提供了更简洁的注入方式,使得代码更加简洁易读。 其次,Spring 框架提供了丰富的事务管理支持。在 Spring 2.0.8 中,有编程式事务管理和声明式事务管理两种方式。编程式...

Global site tag (gtag.js) - Google Analytics