在日常开发中,我们通常使用@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