宿迁网站建设流程,如何评估一个网站,中国十佳企业网站设计公司,php众筹网站程序源码目录
1. 概述
2. 痛点
3. Qualifier
4. Qualifier VS Primary
5. 通过名称来自动注入 1. 概述
今天带你了解一下 Spring 框架中的 Qualifier 注解#xff0c;它解决了哪些问题#xff0c;以及如何使用它。我们还将了解它与 Primary 注解的不同之处。更多的技术解析请访…目录
1. 概述
2. 痛点
3. Qualifier
4. Qualifier VS Primary
5. 通过名称来自动注入 1. 概述
今天带你了解一下 Spring 框架中的 Qualifier 注解它解决了哪些问题以及如何使用它。我们还将了解它与 Primary 注解的不同之处。更多的技术解析请访问 felord.cn
2. 痛点
使用 Autowired 注解是 Spring 依赖注入的绝好方法。但是有些场景下仅仅靠这个注解不足以让Spring知道到底要注入哪个 bean。 默认情况下Autowired 按类型装配 Spring Bean。 如果容器中有多个相同类型的 bean则框架将抛出 NoUniqueBeanDefinitionException 以提示有多个满足条件的 bean 进行自动装配。程序无法正确做出判断使用哪一个下面就是个鲜活的例子 Component(fooFormatter)public class FooFormatter implements Formatter {public String format() {return foo;}}Component(barFormatter)public class BarFormatter implements Formatter {public String format() {return bar;}}Componentpublic class FooService {Autowiredprivate Formatter formatter;//todo }如果我们尝试将 FooService 加载到我们的上下文中Spring 框架将抛出 NoUniqueBeanDefinitionException。这是因为 Spring 不知道要注入哪个 bean。为了避免这个问题有几种解决方案。那么我们本文要讲解的 Qualifier 注解就是其中之一。跟着小胖哥的节奏往下走。
3. Qualifier
通过使用 Qualifier 注解我们可以消除需要注入哪个 bean 的问题。让我们重新回顾一下前面的例子看看我们如何通过包含 Qualifier 注释来指出我们想要使用哪个 bean 来解决问题 Componentpublic class FooService {AutowiredQualifier(fooFormatter)private Formatter formatter;//todo }通过将 Qualifier 注解与我们想要使用的特定 Spring bean 的名称一起进行装配Spring 框架就能从多个相同类型并满足装配要求的 bean 中找到我们想要的避免让Spring脑裂。我们需要做的是Component或者Bean注解中声明的value属性以确定名称。 其实我们也可以在 Formatter 实现类上使用 Qualifier 注释而不是在 Component 或者 Bean 中指定名称也能达到相同的效果 ComponentQualifier(fooFormatter)public class FooFormatter implements Formatter {public String format() {return foo;}}ComponentQualifier(barFormatter)public class BarFormatter implements Formatter {public String format() {return bar;}}4. Qualifier VS Primary
还有另一个名为 Primary 的注解我们也可以用来发生依赖注入的歧义时决定要注入哪个 bean。当存在多个相同类型的 bean 时此注解定义了首选项。除非另有说明否则将使用与 Primary 注释关联的 bean 。 我们来看一个例子 Beanpublic Employee tomEmployee() {return new Employee(Tom);}BeanPrimarypublic Employee johnEmployee() {return new Employee(john);}在此示例中两个方法都返回相同的 Employee类型。Spring 将注入的 bean 是方法 johnEmployee 返回的 bean。这是因为它包含 Primary 注解。当我们想要指定默认情况下应该注入特定类型的 bean 时此注解很有用。 如果我们在某个注入点需要另一个 bean我们需要专门指出它。我们可以通过 Qualifier 注解来做到这一点。例如我们可以通过使用 Qualifier 注释来指定我们想要使用 tomEmployee 方法返回的 bean 。 值得注意的是如果 Qualifier 和 Primary 注释都存在那么 Qualifier 注释将具有优先权。基本上Primary 是定义了默认值而 Qualifier 则非常具体。 当然Component 也可以使用Primary 注解这次使用的还是上面3的示例 ComponentPrimarypublic class FooFormatter implements Formatter {public String format() {return foo;}}Componentpublic class BarFormatter implements Formatter {public String format() {return bar;}}在这种情况下Primary 注解指定了默认注入的是 FooFormatter消除了场景中的注入歧义。
5. 通过名称来自动注入
在使用 Autowired 进行自动装配时如果 Spring 没有其他提示将会按照需要注入的变量名称来寻找合适的 bean。也可以解决依赖注入歧义的问题。让我们看一些基于我们最初的例子的代码 Componentpublic class FooService {Autowiredprivate Formatter fooFormatter;//todo }在这种情况下Spring 将确定要注入的 bean 是 FooFormatter因为字段名称与我们在该 bean 的 Component或者 Bean 注解中使用的值(默认 Bean 使用方法名)相匹配。