springboot 注解 @Qualifier

作用

可以在依赖注入查找候选者的过程中对候选者进行过滤,比如:在需要自动注入java bean时,如果注入的是一个接口,而这个接口又有多个实现类,则会报错,解决方法是在注入接口上增加@Qualifier(“别名”) 和@Autowired注解。
使用范围:字段、方法、参数、任意类型、注解
参数:value

定义

@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE}) @Retention(RetentionPolicy.RUNTIME) 
@Inherited 
@Documented 
public @interface Qualifier { 
	String value() default ""; 
}

使用

1、用于类上

用在类上,你可以理解为给通过@Qulifier给这个bean打一个标签

public interface IService { }
@Component 
@Qualifier("tag1") //@1 
public class Service1 implements IService{ }
@Component 
@Qualifier("tag2") //@2
public class Service2 implements IService { }
@Component 
@Qualifier("tag3") //@3
public class Service3 implements IService { }
@Component 
public class InjectService { 
  
  @Autowired 
  @Qualifier("tag1") //@1 
  private Map<String, IService> serviceMap1; 
  
  @Autowired 
  @Qualifier("tag2") //@2 
  private Map<String, IService> serviceMap2;    
  
  @Autowired 
  @Qualifier("tag3") //@3
  private Map<String, IService> serviceMap3;
}

2、结合@Autowired使用

我们先定义一个接口,以及两个实现类,分别是Servicr1和Service2

public interface IService { }
@Component 
@Qualifier("service1")
public class Service1 implements IService{ }
@Component 
@Qualifier("service2")
public class Service2 implements IService { }
@Component 
public class InjectService { 

  @Autowired 
  @Qualifier("service2") //@1 
  private IService service; 	
}

3、用于方法参数

public interface IService { }
@Component 
@Qualifier("service1")
public class Service1 implements IService{ }
@Component 
@Qualifier("service2")
public class Service2 implements IService { }
@Component 
public class InjectService { 

	private IService s1; 
	
	private IService s2; 
	
	@Autowired 
	public void injectBean(@Qualifier("service2") IService s1, @Qualifier("service1") IService s2) { //@1 
		this.s1 = s1; 
		this.s2 = s2; 
	}	
}

4、用在setter方法上

不管是用在setter方法还是普通方法上面,都是一样的效果

public interface IService { }
@Component 
@Qualifier("service1")
public class Service1 implements IService{ }
@Component 
@Qualifier("service2")
public class Service2 implements IService { }
@Component 
public class InjectService { 
  
  private IService s1; 
  
  private IService s2; 
  
  @Autowired 
  @Qualifier("service2") 
  public void setS1(IService s1) { 
    this.s1 = s1; 
  }
  
  @Autowired 
  @Qualifier("service1") 
  public void setS2(IService s2) { 
    this.s2 = s2; 
  } 
}

上面2个setter方法上都有@Autowired注解,并且结合了@Qulifier注解来限定需要注入哪个bean

原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/268

Previous 2022年9月14日
Next 2022年9月26日

相关推荐

  • SpringBoot 整合Memcached

    简介 Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached…

    springboot 2023年4月24日
    242
  • Springboot 注解 @Resource

    作用 和@Autowired注解类似,也是用来注入依赖对象的,spring容器会对bean中所有的字段、方法进行遍历,标注有@Resouce注解的,都会进行注入。@Autowire…

    springboot 2022年9月14日
    269
  • SpringBoot 缓存 – jetcache

    简介 JetCache是一个基于Java的缓存系统封装,提供统一的API和强大的注解来简化缓存的使用。原生支持TTL、两级缓存、分布式自动刷新,还提供了Cache接口用于手工缓存操…

    springboot 2023年4月23日
    336
  • SpringBoot 打包

    SpringBoot 项目部署到服务器常见的方式就是,打包成 jar 包,通过 nohup java -jar 命令去运行项目,这也是官方推荐的一种方式。 导入依赖 打包 设置打包…

    springboot 2023年4月5日
    148
  • SpringBoot 整合Log4j2日志框架

    简介 Apache Log4j 2是日志框架Log4j的升级,它比其前身Log4j 1.x提供了重要的改进, 并且参考了Logback中许多有用的改进,同时修复了Logback的一…

    springboot 2023年3月26日
    153
  • SpringBoot 缓存 – Redis

    引入依赖 缓存配置 启用缓存 修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下: 配置缓存类 新建Redis缓存配置类RedisConfig,如下: 添加缓…

    2023年4月23日
    160
  • Springboot 注解 @Configuration

    作用 @Configuration用于定义配置类,标注在类上,配置spring容器(应用上下文)。相当于把该类作为spring的xml配置文件中的beans。@Configurat…

    springboot 2022年9月2日
    224
  • SpringBoot 缓存

    简介 缓存主要是为了提高数据的读取速度。 因为服务器和应用客户端之间存在着流量的瓶颈,所以读取大容量数据时,使用缓存来直接为客户端服务,可以减少客户端与服务器端的数据交互,从而大大…

    springboot 2023年4月23日
    133
  • SpringBoot 整合Redis

    添加依赖 在pom.xml文件添加redis的依赖,如下: 配置 在application.yml文件中添加Redis相关的配置项,如下所示: 案例 1、字符串元素 2、List元…

    springboot 2023年3月26日
    121
  • SpringBoot自定义注解与使用

    简介 注解是一种能添加到Java代码中的元数据,方法,类,参数与包都可以使用注解进行修饰,可以将注解看为一种特殊的标记,在Java编译或运行过程中将有这种特殊标记的部分进行特殊处理…

    springboot 2024年1月25日
    254