您当前的位置:首页 > 电脑百科 > 程序开发 > 架构

Spring注入还可以这样玩!涨知识了

时间:2024-05-17 11:46:36  来源:Springboot实战案例锦集  作者:
假设你有两个 CommonDAO bean,每个都需要在不同的环境中使用。这时,你可以使用 @Qualifier 来指定具体的 bean。

环境:Spring6.1.2

1. 简介

@Qualifier是 Spring 框架中的一个注解,它用于消除自动装配(autowiring)时的歧义。在 Spring 应用程序中,当存在多个相同类型的 bean 时,自动装配可能会产生歧义,因为 Spring 容器不知道该选择哪个 bean 进行注入。这时,我们可以使用 @Qualifier 注解来明确指定要注入的 bean。

假设你有两个 CommonDAO bean,每个都需要在不同的环境中使用。这时,你可以使用 @Qualifier 来指定具体的 bean。

public class CommonService {
  @Resource
  @Qualifier
  private CommonDAO dao ;
}
@Configuration
public class AppConfig {
  @Bean
  @Qualifier
  public TeacherDAO teacherDAO() {
    return new TeacherDAO() ;
  }
  @Bean
  public StudentDAO studentDAO() {
    return new StudentDAO() ;
  }
  @Bean
  public CommonService commonService() {
    return new CommonService() ;
  }
}

上面示例中如果注入的CommonDAO字段上没有添加@Qualifier注解,那么程序将会报错,这里通过@Qualifier注解来限定注入的值;该注解也可以设置value属性。

2. 更多玩法

上面直接通过使用@Qualifier注解来限定注入值,接下来将介绍其它的使用方法。

2.1 自定义限定注解

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Pack {
  String value();
}

自定义限定注解,该注解上使用了@Qualifier注解。接下来我们就可以使用该注解。

public class CommonService {
  @Resource
  @Pack
  private CommonDAO dao ;
}
@Bean
@Pack
public TeacherDAO teacherDAO() {
  return new TeacherDAO() ;
}

这时候你就可以自定义不同的注解分别标准你要注入的值。

2.2 泛型限定注入

有如下接口定义,该接口是泛型接口:

public class Teacher {}
public class Student {}
public interface CommonDAO<T> {}
public class TeacherDAO implements CommonDAO<Teacher> {}
public class StudentDAO implements CommonDAO<Student> {}
public class CommonService {
  @Resource
  private CommonDAO<Student> dao ;
  @Override
  public String toString() {
    return "CommonService [dao=" + dao + "]";
  }
}

在上面CommonDAO的注入中如果你泛型使用的Student那么注入的将是StudentDAO,如果是Teacher类型,那么注入的将是TeacherDAO。

泛型限定符也可用于List、Map 实例和数组。如下使用List示例:

@Resource
private List<CommonDAO<Student>> daos ;

这将注入容器中所有泛型是Student类型的CommonDAO实例对象。

2.3 完全自定义注解

有如下注解,我们完全可以不依赖任何Spring相关的注解实现限定的注入值。

@Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Pack {
  String value() default "" ;
}

该自定义注解并没有使用Spring的@Qualifier注解。要使得上面注解生效你还需要配置如下类:

@Bean
public CustomAutowireConfigurer customAutowireConfigurer() {
  CustomAutowireConfigurer autowireConfigurer = new CustomAutowireConfigurer() ;
  // 指定我们自定义的注解
  autowireConfigurer.setCustomQualifierTypes(Set.of(Pack.class)) ;
  return autowireConfigurer ;
}

CustomAutowireConfigurer是BeanFactoryPostProcessor,这会帮助我们注册自定义的限定注解。

2.4 更多属性控制

除了上面的方式限定注入的值,我们还可以自定义注解,指定更多的属性值去匹配bean对象,只有bean对象具有相同的属性值(元数据信息)才能匹配。

public enum Format {
  JSON, CSV, PLAIN
}
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Qualifier
public @interface Pack {
  String value() default "" ;
  // 指定格式
  Format format() ;
}
// Bean定义指定每一种bean对应的格式format
@Pack(format = Format.CSV)
public class CSVDAO implements CommonDAO {}
@Pack(format = Format.JSON)
public class JSONDAO implements CommonDAO {}

接下来在注册上面两个*DAO bean时就不能通过注解的方式了,只能通过xml或者BeanDefinition的方式注册,如下示例:

ApplicationContext context = ... ;
// 分别设置他们的元数据信息。
context.registerBean(CSVDAO.class, bd -> {
  bd.setAttribute("format", "CSV") ;
});
context.registerBean(JSONDAO.class, bd -> {
  bd.setAttribute("format", "JSON") ;
});

注入配置:

@Resource
@Pack(format = Format.JSON)
private CommonDAO dao ;

通过上面指定format属性,以确定需要注入对象的明确要求。



Tags:Spring   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring注入还可以这样玩!涨知识了
假设你有两个 CommonDAO bean,每个都需要在不同的环境中使用。这时,你可以使用 @Qualifier 来指定具体的 bean。环境:Spring6.1.21. 简介@Qualifier是 Spring 框架中的一个注解...【详细内容】
2024-05-17  Search: Spring  点击:(0)  评论:(0)  加入收藏
深入理解并掌握 Spring AI 与 Open AI 的使用方法
Spring AI,作为行业领导者,通过其强大、灵活的API和先进的功能,为各种行业提供了颠覆性的解决方案。在本专题中,我们将深入探讨Spring AI在各领域的应用示例。每个案例都将展示...【详细内容】
2024-04-29  Search: Spring  点击:(11)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  Search: Spring  点击:(70)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  Search: Spring  点击:(59)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  Search: Spring  点击:(41)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  Search: Spring  点击:(124)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19  Search: Spring  点击:(108)  评论:(0)  加入收藏
Spring Boot2.0深度实践 核心原理拆解+源码分析
Spring Boot2.0深度实践:核心原理拆解与源码分析一、引言Spring Boot是一个基于Java的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用...【详细内容】
2024-01-15  Search: Spring  点击:(140)  评论:(0)  加入收藏
SpringBoot3+Vue3 开发高并发秒杀抢购系统
开发高并发秒杀抢购系统:使用SpringBoot3+Vue3的实践之旅随着互联网技术的发展,电商行业对秒杀抢购系统的需求越来越高。为了满足这种高并发、高流量的场景,我们决定使用Spring...【详细内容】
2024-01-14  Search: Spring  点击:(125)  评论:(0)  加入收藏
Spring Boot 3.0是什么?
Spring Boot 3.0是一款基于Java的开源框架,用于简化Spring应用程序的构建和开发过程。与之前的版本相比,Spring Boot 3.0在多个方面进行了改进和增强,使其更加易用、高效和灵活...【详细内容】
2024-01-11  Search: Spring  点击:(171)  评论:(0)  加入收藏
▌简易百科推荐
Spring注入还可以这样玩!涨知识了
假设你有两个 CommonDAO bean,每个都需要在不同的环境中使用。这时,你可以使用 @Qualifier 来指定具体的 bean。环境:Spring6.1.21. 简介@Qualifier是 Spring 框架中的一个注解...【详细内容】
2024-05-17    Springboot实战案例锦集  Tags:Spring   点击:(0)  评论:(0)  加入收藏
运维总监怒怼开发:你真的需要 K8s 吗?
Kubernetes 以其自动化管理与可扩展性等优点不断吸引着新用户,然而,它的配置复杂与资源消耗高等特点也一直被诟病,开发人员或许都曾扪心自问:我们真的需要 Kubernetes 吗?秉持着...【详细内容】
2024-05-15    dbaplus社群  Tags:K8s   点击:(4)  评论:(0)  加入收藏
2024年的云原生架构需要哪些技术栈
背景时间过得很快啊,一转眼已经到了 2024 年,还记得 15 年刚工作那会掌握个 SSM/H(Spring/Struts2/Mybatis/Hibernate) 框架就能应付大部分面试了。现在 CS 专业的新同学估计...【详细内容】
2024-04-22    dbaplus社群  Tags:架构   点击:(13)  评论:(0)  加入收藏
对于微服务架构监控应该遵守的原则
随着软件交付方式的变革,微服务架构的兴起使得软件开发变得更加快速和灵活。在这种情况下,监控系统成为了微服务控制系统的核心组成部分。随着软件的复杂性不断增加,了解系统的...【详细内容】
2024-04-03  步步运维步步坑    Tags:架构   点击:(19)  评论:(0)  加入收藏
大模型应用的 10 种架构模式
作者 | 曹洪伟在塑造新领域的过程中,我们往往依赖于一些经过实践验证的策略、方法和模式。这种观念对于软件工程领域的专业人士来说,已经司空见惯,设计模式已成为程序员们的重...【详细内容】
2024-03-27    InfoQ  Tags:架构模式   点击:(33)  评论:(0)  加入收藏
哈啰云原生架构落地实践
一、弹性伸缩技术实践1.全网容器化后一线研发的使用问题全网容器化后一线研发会面临一系列使用问题,包括时机、容量、效率和成本问题,弹性伸缩是云原生容器化后的必然技术选择...【详细内容】
2024-03-27  哈啰技术  微信公众号  Tags:架构   点击:(24)  评论:(0)  加入收藏
DDD 与 CQRS 才是黄金组合
在日常工作中,你是否也遇到过下面几种情况: 使用一个已有接口进行业务开发,上线后出现严重的性能问题,被老板当众质疑:“你为什么不使用缓存接口,这个接口全部走数据库,这怎么能扛...【详细内容】
2024-03-27  dbaplus社群    Tags:DDD   点击:(42)  评论:(0)  加入收藏
高并发架构设计(三大利器:缓存、限流和降级)
软件系统有三个追求:高性能、高并发、高可用,俗称三高。本篇讨论高并发,从高并发是什么到高并发应对的策略、缓存、限流、降级等。引言1.高并发背景互联网行业迅速发展,用户量剧...【详细内容】
2024-03-13    阿里云开发者  Tags:高并发   点击:(22)  评论:(0)  加入收藏
如何判断架构设计的优劣?
架构设计的基本准则是非常重要的,它们指导着我们如何构建可靠、可维护、可测试的系统。下面是这些准则的转换表达方式:简单即美(KISS):KISS原则的核心思想是保持简单。在设计系统...【详细内容】
2024-02-20  二进制跳动  微信公众号  Tags:架构设计   点击:(54)  评论:(0)  加入收藏
详解基于SpringBoot的WebSocket应用开发
在现代Web应用中,实时交互和数据推送的需求日益增长。WebSocket协议作为一种全双工通信协议,允许服务端与客户端之间建立持久性的连接,实现实时、双向的数据传输,极大地提升了用...【详细内容】
2024-01-30  ijunfu  今日头条  Tags:SpringBoot   点击:(41)  评论:(0)  加入收藏
站内最新
站内热门
站内头条