Spring注解@Qualifier的详细用法你知道几种

环境:springboot2.3.10

一般使用在项目中使用@Qualifier来限定注入的Bean。

由于项目中我习惯用@Resource注解,所以这里先对@Autowired和@Resource进行个简单的说明。

@Autowired和@Resource区别

相同点:

@Autowired与@Resource都可以用来装配Bean。都可以写在字段上,或写在setter方法上。

区别:

1、@Autowired(Spring注解)

默认按类型装配,默认情况下必须要求依赖对象必须存在(不存在会报错),可以通过required=false属性设置非必须 ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,示例如下:

@Autowired(required = false)
private Date date ;
@Autowired
@Qualifier("birth")
private Date birthday ;

当系统中存在多个相同类型的Bean时,如果不使用@Qualifier程序启动是会报错

@Bean
public Date d1() {
  return new Date() ;
}
@Bean
public Date d2() {
  return new Date() ;
}
@Autowired
private Date date ;

2、@Resoure(JavaEE注解)

默认按照名称进行装配,可以通过name属性指定名称,如果没有指定name属性,当注解写在字段上时,默认取字段名进行查找注入,如果写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。示例:

还是上面的例子

@Resource
private Date date

启动后会报错:

Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'java.util.Date' available: expected single matching bean but found 2: d1,d2

因为我们没有以date为名称的bean,所以会按照类型进行注入,但是类型又有两个Date的Bean。将date改为d1或者d2或者指明name属性。

@Resource("d1")
private Date date

@Autowired和@Resource就介绍到这里了

常规用法限定注入类

通过上面的示例我们已经了解了@Qualifier的主用

@Autowired
@Qualifier("d1")
private Date date ;

用来限定注入的Bean的名称。这种用法也是很好的理解,接下来我们介绍通过@Qualifier来筛选限定注入对象。

@Qualifier筛选注入对象

直接使用@Qualifier限定

@Qualifier
@Bean
public Date d1() {
  return new Date() ;
}
@Bean
public Date d2() {
  return new Date() ;
}
@Resource
private List<Date> dates = Collections.emptyList() ;

打印dates集合:

集合中注入了2个Date Bean。

修改代码:

@Resource
@Qualifier
private List<Date> dates = Collections.emptyList() ;

在属性上加入@Qualifier注解

执行结果:

只注入了一个Date Bean。

@Qualifier起到了一个筛选的作用只有Bean上加有@Qualifier注解的Bean才会被收集注入。

自定义注解限定注入Bean

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface FK {

}

注意:该自定义注解上添加有@Qualifier注解。

@FK
@Bean
public Date d1() {
  return new Date() ;
}
@Bean
public Date d2() {
  return new Date() ;
}
@Resource
@FK
private List<Date> dates = Collections.emptyList() ;

运行:

注入了一个Date Bean。

该使用示例在Spring Cloud中Ribbon是也有应用的。

在使用Ribbon做负载均衡时,在配置RestTemplate时会加入如下注解:

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
  return new RestTemplate() ;
}
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}

在Ribbon的自动配置类中:

这里指明了只收集带有@LoadBalanced注解的RestTemplate对象。然后给对应RestTemplate设置拦截器来实现直接通过服务名就能调用接口。接下来简单介绍下RestTemplate怎么实现负载均衡。

拦截器中就开始获取服务名,然后调用createRequest方法来将serviceName换成真实的IP

ServiceRequestWrapper类

进入ServiceRequestWrapper类,该类重写了HttpRequest对象的getURI方法

通过负载均衡重写构造URI

这里相关的Ribbon相关实现的负载均衡我们都省略了,这里给出几个核心的类:

LoadBalancerAutoConfiguration.java 负载均衡自动配置

RibbonClientConfiguration.java ribbon客户端相关配置,比如:负载均衡的算法,服务列表的更新,ping健康检查等。如果想自定义实现负载均衡算法可以实现IRule类。

完毕!!!

到此这篇关于Spring注解@Qualifier这种用法你知道吗?的文章就介绍到这了,更多相关Spring注解@Qualifier内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 解决spring boot启动扫描不到自定义注解的问题

    对于自定义注解这里就不唠叨了,百度一大堆,这里有我一个自定义注解 @Retention(RetentionPolicy.RUNTIME) @Target({ ElementType.METHOD }) public @interface MsgEvent { RetailOrderEvent msgEvent(); } 注解实现类 @Component public class MsgEventProcessor implements BeanPostProcessor { /** * 事件消息

  • Spring Boot整合mybatis使用注解实现动态Sql、参数传递等常用操作(实现方法)

    前面介绍了Spring Boot 整合mybatis 使用注解的方式实现数据库操作,介绍了如何自动生成注解版的mapper 和pojo类. 接下来介绍使用mybatis 常用注解以及如何传参数等数据库操作中的常用操作. 其实,mybatis 注解方式 和 XML配置方式两者的使用基本上相同,只有在构建 SQL 脚本有所区别,所以这里重点介绍两者之间的差异,以及增删改查,参数传递等注解的常用操作. 详解SpringBoot 快速整合Mybatis(去XML化+注解进阶)已经介绍过了,不清楚的朋友可

  • 使用@SpringBootTest注解进行单元测试

    概述 @SpringBootTest注解是SpringBoot自1.4.0版本开始引入的一个用于测试的注解.基本用法如下: 1. 添加Maven依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <parent> <groupId>org.springframework.boot</gro

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

    一 前言 本篇内容主要是讲解2个重要的注解使用方式和场景,@Primary,@Qualifier注解:其作用就是消除bean注入时的歧义,能够让spring容器知道加载哪个bean: 知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;) 二 实现方式 如下示例中使用被单接口Sheet, 实现类为SheetA , SHeetB ; 由于注入容器时都是 Sheet类型,会发生异常,此时就是使用@Pri

  • springboot @ConditionalOnMissingBean注解的作用详解

    @ConditionalOnMissingBean,它是修饰bean的一个注解,主要实现的是,当你的bean被注册之后,如果而注册相同类型的bean,就不会成功,它会保证你的bean只有一个,即你的实例只有一个,当你注册多个相同的bean时,会出现异常,以此来告诉开发人员. 代码演示 @Component public class AutoConfig { @Bean public AConfig aConfig() { return new AConfig("lind"); } @B

  • Spring注解@Qualifier的详细用法你知道几种

    环境:springboot2.3.10 一般使用在项目中使用@Qualifier来限定注入的Bean. 由于项目中我习惯用@Resource注解,所以这里先对@Autowired和@Resource进行个简单的说明. @Autowired和@Resource区别 相同点: @Autowired与@Resource都可以用来装配Bean.都可以写在字段上,或写在setter方法上. 区别: 1.@Autowired(Spring注解) 默认按类型装配,默认情况下必须要求依赖对象必须存在(不存在会报

  • Spring注解@Scope原理及用法解析

    主要从以下几方面来介绍一下@Scope注解 @Scope注解是什么 @Scope注解怎么使用 @Scope注解的使用场景 1,@Scope注解是什么 @Scope注解是springIoc容器中的一个作用域,在 Spring IoC 容器中具有以下几种作用域:基本作用域singleton(单例).prototype(多例),Web 作用域(reqeust.session.globalsession),自定义作用域 a.singleton单例模式 -- 全局有且仅有一个实例 b.prototype原

  • Spring注解驱动之ApplicationListener用法解读

    目录 ApplicationListener概述 ApplicationListener作用 ApplicationListener用法 ApplicationListener概述 ApplicationListener按照字面意思,它应该是Spring里面的应用监听器,也就是Spring为我们提供的基于事件驱动开发的功能. 也就是说我们只要写一个监听器来实现ApplicationListener接口,该接口中泛型就是我们要监听的事件,那么如果我们发布对应的事件,就能在实现的监听器里面处理. A

  • 详解Spring注解 @Configuration

    目录 @Configuration 注解的概述 底层原理 与 Spring IoC 容器的集成 Bean 的定义和装配的实现 条件化配置的实现 配置类的加载和实例化过程 总结 Spring 提供了丰富的特性和功能,包括依赖注入.面向切面编程.事务管理.数据访问.Web应用程序开发等.其中,@Configuration 是 Spring 中的一个注解,它用于标记一个类为配置类,通过配置类可以定义和组装 Spring Bean,并且支持高度灵活的配置方式.在本文中,我们将深入探讨 @Configur

  • Spring注解驱动之ApplicationListener异步处理事件说明

    目录 概述 示例 自定义事件多波器 测试用例 ApplicationListener异步执行源码分析 概述 之前我们讲过简单使用ApplicationListener发布事件,处理事件,但是发现是同一个线程发送事件并自己处理事件的. 下面我们就来说下如何使用自定义的线程池来异步处理接收的事件. 示例 实现一个ApplicationListener用于处理事件 package com.atguigu.ext; import org.springframework.context.Applicati

  • 基于Spring的注解@Qualifier小结

    目录 Spring的注解@Qualifier小结 先说明下场景,代码如下 @qualifier注解 参见下面的例子 Spring的注解@Qualifier小结 近期在捯饬spring的注解,现将遇到的问题记录下来,以供遇到同样问题的童鞋解决~ 先说明下场景,代码如下 有如下接口: public interface EmployeeService { public EmployeeDto getEmployeeById(Long id); } 同时有下述两个实现类 EmployeeServiceI

  • 详解Spring注解--@Autowired、@Resource和@Service

    什么是注解 传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop.事物,这么做有两个缺点: 1.如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大:如果按需求分开.xml文件,那么.xml文件又会非常多.总之这将导致配置文件的可读性与可维护性变得很低 2.在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率 为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java

  • 彻底理解Spring注解@Autowired实现原理

    目录 前言 1.@Autowired注解用法 2.@Autowired注解的作用到底是什么 3.@Autowired注解是如何实现的 自己实现一个注解 4.@Autowired注解实现逻辑分析 5.问题 5.1.注解的有效周期是什么? 5.2.注入的bean和用它的bean的关系是如何维护的? 5.3.为什么注入的bean不能被定义为static的? 前言 使用spring开发时,进行配置主要有两种方式,一是xml的方式,二是java config的方式. spring技术自身也在不断的发展和改

  • 浅谈Spring @Async异步线程池用法总结

    本文介绍了Spring @Async异步线程池用法总结,分享给大家,希望对大家有帮助 1. TaskExecutor spring异步线程池的接口类,其实质是Java.util.concurrent.Executor Spring 已经实现的异常线程池: 1. SimpleAsyncTaskExecutor:不是真的线程池,这个类不重用线程,每次调用都会创建一个新的线程. 2. SyncTaskExecutor:这个类没有实现异步调用,只是一个同步操作.只适用于不需要多线程的地方 3. Conc

  • Spring注解@RestControllerAdvice原理解析

    这篇文章主要介绍了Spring注解@RestControllerAdvice原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 前言 前段时间部门搭建新系统,需要出异常后统一接口的返回格式,于是用到了Spring的注解@RestControllerAdvice.现在把此注解的用法总结一下. 用法 首先定义返回对象ResponseDto package com.staff.points.common; import lombok.Data;

随机推荐