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

环境:springboot2.3.10

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

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

@Autowired和@Resource区别

相同点:

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

区别:

1、@Autowired(Spring注解)

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

1

2

3

4

5

@Autowired(required = false)

private Date date ;

@Autowired

@Qualifier("birth")

private Date birthday ;

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

1

2

3

4

5

6

7

8

9

10

@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属性一旦指定,就只会按照名称进行装配。示例:

还是上面的例子

1

2

@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属性。

1

2

@Resource("d1")

private Date date

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

常规用法限定注入类

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

1

2

3

@Autowired

@Qualifier("d1")

private Date date ;

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

@Qualifier筛选注入对象

直接使用@Qualifier限定

1

2

3

4

5

6

7

8

9

10

11

@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。

修改代码:

1

2

3

@Resource

@Qualifier

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

在属性上加入@Qualifier注解

执行结果:

只注入了一个Date Bean。

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

自定义注解限定注入Bean

1

2

3

4

5

6

7

8

@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@Qualifier

public @interface FK {

}

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

1

2

3

4

5

6

7

8

9

10

11

12

@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时会加入如下注解:

1

2

3

4

5

6

7

8

9

10

11

12

@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类。

### 回答1: Spring Qualifier 是用来解决依赖注入时出现多个同类型 Bean 的问题的。通过在需要注入的字段或方法参数上添加 @Qualifier 注解,指定需要注入的 Bean 的名称或 ID,从而避免了歧义性。在配置文件中,可以使用 @Bean 注解来定义 Bean,也可以使用 XML 配置文件来定义 Bean。 ### 回答2: Spring Qualifier配置是Spring框架中的一个注解,用于解决在自动装配时出现的歧义性问题。 在Spring中,当存在多个相同类型的Bean时,自动装配的过程中可能会产生歧义,无法确定要选择哪个Bean进行注入。此时就可以使用@Qualifier注解来指定具体的Bean。 @Qualifier注解可以配合@Autowired、@Resource、@Inject等注解一起使用。例如,当某个类中存在多个实现接口的Bean时,可以使用@Qualifier注解来选择需要注入的Bean: ```java @Autowired @Qualifier("bean1") private MyInterface myInterface; ``` 上述代码中,@Qualifier("bean1")指定了需要注入的Bean名称为"bean1",从而解决了自动装配时的歧义性。 @Qualifier注解还可以通过使用自定义注解来扩展,以便更加简化和提高代码的可读性。例如,定义一个自定义注解@MyQualifier: ```java @Target({ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface MyQualifier { String value() default ""; } ``` 然后在需要注入的位置使用@MyQualifier注解: ```java @Autowired @MyQualifier("bean1") private MyInterface myInterface; ``` 通过自定义注解@MyQualifier,可以更加清晰地表达需要注入的Bean。 总而言之,Spring Qualifier配置提供了一种灵活的方式来解决自动装配时的歧义性问题,可以通过指定具体的Bean来确保注入的准确性。 ### 回答3: Spring@Qualifier注解是用于指定一个bean的特定实现,当一个接口有多个实现类时,在注入bean的时候可以使用@Qualifier注解来指定要注入的bean。 @Qualifier注解需要和@Autowired或@Inject等注解一起使用,通过指定具体的bean名称,告诉Spring要注入的是哪个实现类。 在应用程序中,当一个接口有多个实现类时,可以使用@Qualifier来区分它们。在需要注入的地方使用@Autowired或@Inject注解,然后在@Qualifier注解中指定具体的bean名称,Spring就会根据指定的名称来注入对应的实现类。 使用@Qualifier注解可以避免歧义性,确保正确的bean被注入到所需的位置。这样,在应用程序中可以方便地切换、替换不同的实现类,提高了代码的灵活性和可维护性。 几种常见的@Qualifier用法包括: 1. 使用@Qualifier指定bean名称: ```java @Autowired @Qualifier("beanName") private InterfaceName interfaceName; ``` 2. 使用自定义的@Qualifier注解: ```java @Autowired @CustomQualifierAnnotation private InterfaceName interfaceName; ``` 3. 结合@Primary注解使用@Qualifier: ```java @Primary @Component public class PrimaryImpl implements InterfaceName{ ... } @Component public class SecondaryImpl implements InterfaceName{ ... } @Autowired @Qualifier("primaryImpl") private InterfaceName interfaceName; ``` 总结而言,@Qualifier注解Spring中的使用非常灵活,可以根据具体需求来指定要注入的bean,提高代码的可维护性和扩展性。同时,搭配其他注解如@Primary,可以更好地满足多个实现类的注入需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值