Spring条件注解用法案例分析
本文实例讲述了Spring条件注解用法。分享给大家供大家参考,具体如下:
一点睛
Spring4提供了一个更通用的基于条件的Bean的创建,即使用@Conditional注解。
@Conditional根据满足仅一个特定条件创建一个特定的Bean。也就是根据特定的条件来控制Bean的创建行为,这样就可以利用这个特性进行一些自动的配置。
二项目说明
以不同的操作系统为条件,通过实现@Condition接口,并重写matches方法来构造条件。若在windows系统下运行,则输出列表命令为dir;若在Linux操作系统下运行程序,则输出列表命令为ls。
三实战
1判断条件定义
1.1windows的判定条件
packagecom.wisely.highlight_spring4.ch3.conditional; importorg.springframework.context.annotation.Condition; importorg.springframework.context.annotation.ConditionContext; importorg.springframework.core.type.AnnotatedTypeMetadata; publicclassWindowsConditionimplementsCondition{ publicbooleanmatches(ConditionContextcontext, AnnotatedTypeMetadatametadata){ returncontext.getEnvironment().getProperty("os.name").contains("Windows"); } }
1.2Linux的判定条件
packagecom.wisely.highlight_spring4.ch3.conditional; importorg.springframework.context.annotation.Condition; importorg.springframework.context.annotation.ConditionContext; importorg.springframework.core.type.AnnotatedTypeMetadata; publicclassLinuxConditionimplementsCondition{ publicbooleanmatches(ConditionContextcontext, AnnotatedTypeMetadatametadata){ returncontext.getEnvironment().getProperty("os.name").contains("Linux"); } }
2不同系统下的Bean类
2.1接口
packagecom.wisely.highlight_spring4.ch3.conditional; publicinterfaceListService{ publicStringshowListCmd(); }
2.2Window下创建的Bean类
packagecom.wisely.highlight_spring4.ch3.conditional; publicclassWindowsListServiceimplementsListService{ @Override publicStringshowListCmd(){ return"dir"; } }
2.3Linux下所创建的Bean类
packagecom.wisely.highlight_spring4.ch3.conditional; publicclassLinuxListServiceimplementsListService{ @Override publicStringshowListCmd(){ return"ls"; } }
3配置类
packagecom.wisely.highlight_spring4.ch3.conditional; importorg.springframework.context.annotation.Bean; importorg.springframework.context.annotation.Conditional; importorg.springframework.context.annotation.Configuration; @Configuration publicclassConditionConifg{ @Bean @Conditional(WindowsCondition.class)//符合window条件,则实例化WindowsListService publicListServicewindowsListService(){ returnnewWindowsListService(); } @Bean @Conditional(LinuxCondition.class)//符合Linux条件,则实例化LinuxListService publicListServicelinuxListService(){ returnnewLinuxListService(); } }
4主类
packagecom.wisely.highlight_spring4.ch3.conditional; importorg.springframework.context.annotation.AnnotationConfigApplicationContext; publicclassMain{ publicstaticvoidmain(String[]args){ AnnotationConfigApplicationContextcontext= newAnnotationConfigApplicationContext(ConditionConifg.class); ListServicelistService=context.getBean(ListService.class); System.out.println(context.getEnvironment().getProperty("os.name") +"系统下的列表命令为:" +listService.showListCmd()); context.close(); } }
四运行
windows下运行结果如下:
Windows10系统下的列表命令为:dir
五扩展
如果把LinuxCondition条件改成和WindowsCondition一样的条件会怎样呢?即有两个条件都匹配会怎样呢?
修改后的代码如下:
publicclassLinuxConditionimplementsCondition{ publicbooleanmatches(ConditionContextcontext, AnnotatedTypeMetadatametadata){ returncontext.getEnvironment().getProperty("os.name").contains("Windows"); } }
修改后再运行,报错了:
Exceptioninthread"main"org.springframework.beans.factory.NoUniqueBeanDefinitionException:Noqualifyingbeanoftype[com.wisely.highlight_spring4.ch3.conditional.ListService]isdefined:expectedsinglematchingbeanbutfound2:linuxListService,windowsListService
atorg.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:365)
atorg.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:331)
atorg.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:968)
atcom.wisely.highlight_spring4.ch3.conditional.Main.main(Main.java:11)
报错信息很明显:
[com.wisely.highlight_spring4.ch3.conditional.ListService]isdefined:expectedsinglematchingbeanbutfound2:linuxListService,windowsListService
匹配到了两条,所以针对条件判断,设计程序时,只能匹配上一条,否则会抛异常。
更多关于java相关内容感兴趣的读者可查看本站专题:《Spring框架入门与进阶教程》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。