primary(primarily)

在日常开发中,我们通常使用@Autowired来注入bean,默认情况下根据类型自动注入这个注释。但是,在某些特殊情况下,例如,同一个接口可能有几个不同的实现类

在日常开发中,我们通常使用@Autowired来注入bean,默认情况下根据类型自动注入这个注释。但是,在某些特殊情况下,例如,同一个接口可能有几个不同的实现类。此时,如果没有特殊指定,spring将无法决定注入相应的bean,而只会抛出一个异常。(ps:参考文章《@Autowired和@Resource的区别》和《spring如何扫描@Autowired,@Value,@Resource》)

@Qualifier、@Priority、@Primary简介

@Qualifier:通常与@Autowired一起使用,通过指定特定的beanName来注入相应的bean。

@Priority:通过比较该评论中包含的数值,确定先注入哪个bean。数值越小,首先注入的就越多。

@Primary:当自动组装过程中出现多个bean候选时,将首先注入带有注释@Primary的bean。

这三个标注单独使用基本可以理解,但是这三个标注同时使用的时候,有一定的注豆顺序。接下来,将演示代码以加深理解。

代码示例

定义选定Bean的接口

公共接口selected bean { void get bean name();}定义三个SelectedBean接口的实现类

导入org . spring framework . context . annotation . primary;导入org . spring framework . stereotype . component;@ Component @ Primary//specify comment @ Primary public class Primary selected bean实现selected bean { @ override public void get bean name(){ system . out . println(& # 34;primarySelectedBean & # 34);}}

导入org . spring framework . stereotype . component;导入javax . annotation . priority;@ Component @ Priority(1)//Specify comment @ Priority public class Priority first selected bean实现选定的bean { @ override public void get bean name(){ system . out . println(& # 34;priorityFirstSelectedBean & # 34);}}

导入org . spring framework . stereotype . component;导入javax . annotation . priority;@ Component @ Priority(2)//Specify comment @ Priority public class Priority second selected bean实现选定的bean { @ override public void get bean name(){ system . out . println(& # 34;prioritySecondSelectedBean & # 34;);}}定义一个服务类TestSelectedBeanService。

导入org . spring framework . beans . factory . annotation . auto wired;导入org . spring framework . stereotype . component;@Componentpublic类testselectedbean service { @ auto wired private selected bean selected bean;public void get bean name(){ selected bean . get bean name();}}定义一个测试类AppConfig

import org . spring framework . context . annotation . annotationconfigapplicationcontext;导入org . spring framework . context . annotation . components can;导入org . spring framework . context . annotation . configuration;@ Configuration @ components can(& # 34;com . lr . interfaces . primary & # 34;)public class AppConfig { public static void main(String[]args){ AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig . class);TestSelectedBeanService bean = context . get bean(TestSelectedBeanService . class);bean . get bean name();}}在不同的类上添加不同的注释,以表格形式统计不同的测试结果:

注射结果

PrimarySelectedBean

PriorityFirstSelectedBean

PrioritySecondSelectedBean

结果一

@主要

@优先级(1)

@优先级(2)

PrimarySelectedBean

结果2

@优先级(1)

@优先级(2)

PriorityFirstSelectedBean

结果三

@优先级(2)

@优先级(1)

PrioritySecondSelectedBean

四个结果

没有任何名称。

错误报告

结果五

优先考虑由@Qualifier指定的bean。

总结以上测试,可以得出以下结论:弹簧喷油时:

(1)第一个候选bean是由@Qualifier指定的bean;

(2)第二个候选bean是@Primary指定的bean;

(3)第三个候选bean是@Priority值较小的bean。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/201882.html

发表回复

登录后才能评论