当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2024-05-17 17:48:25 267观看
导读环境:Spring6.1.21. 简介@Qualifier是 Spring 框架中的一个注解,它用于消除自动装配(autowiring)时的歧义。在 Spring 应用程序中,当存在多个相同类型的 bean 时,自动装配可能会产生歧义,因为 Spring 容器不知道该选择哪个 b

环境:Spring6.1.2k9z28资讯网——每日最新资讯28at.com

1. 简介

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

假设你有两个 CommonDAO bean,每个都需要在不同的环境中使用。这时,你可以使用 @Qualifier 来指定具体的 bean。k9z28资讯网——每日最新资讯28at.com

public class CommonService {  @Resource  @Qualifier  private CommonDAO dao ;}@Configurationpublic 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属性。k9z28资讯网——每日最新资讯28at.com

2. 更多玩法

上面直接通过使用@Qualifier注解来限定注入值,接下来将介绍其它的使用方法。k9z28资讯网——每日最新资讯28at.com

2.1 自定义限定注解

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

自定义限定注解,该注解上使用了@Qualifier注解。接下来我们就可以使用该注解。k9z28资讯网——每日最新资讯28at.com

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

这时候你就可以自定义不同的注解分别标准你要注入的值。k9z28资讯网——每日最新资讯28at.com

2.2 泛型限定注入

有如下接口定义,该接口是泛型接口:k9z28资讯网——每日最新资讯28at.com

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。k9z28资讯网——每日最新资讯28at.com

泛型限定符也可用于List、Map 实例和数组。如下使用List示例:k9z28资讯网——每日最新资讯28at.com

@Resourceprivate List<CommonDAO<Student>> daos ;

这将注入容器中所有泛型是Student类型的CommonDAO实例对象。k9z28资讯网——每日最新资讯28at.com

2.3 完全自定义注解

有如下注解,我们完全可以不依赖任何Spring相关的注解实现限定的注入值。k9z28资讯网——每日最新资讯28at.com

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

该自定义注解并没有使用Spring的@Qualifier注解。要使得上面注解生效你还需要配置如下类:k9z28资讯网——每日最新资讯28at.com

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

CustomAutowireConfigurer是BeanFactoryPostProcessor,这会帮助我们注册自定义的限定注解。k9z28资讯网——每日最新资讯28at.com

2.4 更多属性控制

除了上面的方式限定注入的值,我们还可以自定义注解,指定更多的属性值去匹配bean对象,只有bean对象具有相同的属性值(元数据信息)才能匹配。k9z28资讯网——每日最新资讯28at.com

public enum Format {  JSON, CSV, PLAIN}@Target({ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Qualifierpublic @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的方式注册,如下示例:k9z28资讯网——每日最新资讯28at.com

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

注入配置:k9z28资讯网——每日最新资讯28at.com

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

通过上面指定format属性,以确定需要注入对象的明确要求。k9z28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-88932-0.htmlSpring注入还可以这样玩!涨知识了

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 精通Python单元测试:掌握Unittest模块的终极指南

下一篇: 聊聊乐观锁与悲观锁

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • 红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 腾讯VS网易,最卷游戏暑期档,谁能笑到最后?

    作者:无锈钵来源:财经无忌7月16日晚,上海1862时尚艺术中心。伴随着幻象的精准命中,硕大的荧幕之上,比分被定格在了14:12,被寄予厚望的EDG战队以绝对的优势战胜了BLG战队,拿下了总决
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO 11S屏幕细节公布:首发三星2K E6全感屏 安卓最好的直屏手机

    日前iQOO手机官方宣布,新一代电竞旗舰iQOO 11S将会在7月4日19:00正式与大家见面。随着发布时间的日益临近,官方关于该机的预热也更加密集,截至目前已
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
Top