接下来,我们就需要在PersonConfig2类中使用@Conditional注解添加条件了 。添加注解后的方法如下所示 。
@Conditional({WindowsCondition.class})@Bean("binghe001")public Person person01(){return new Person("binghe001", 18);}@Conditional({LinuxCondition.class})@Bean("binghe002")public Person person02(){return new Person("binghe002", 20);}
此时,我们再次运行SpringBeanTest类中的testAnnotationConfig6()方法,输出的结果信息如下所示 。
Windows 10personbinghe001给容器中添加Person....{person=Person(name=binghe002, age=18), binghe001=Person(name=binghe001, age=18)}
可以看到,输出结果中不再含有名称为binghe002的bean了,说明程序中检测到当前操作系统为Windows10,没有向Spring容器中注册名称为binghe002的bean 。
@Conditional注解也可以标注在类上,标注在类上含义为:满足当前条件,这个类中配置的所有bean注册才能生效,大家可以自行验证@Conditional注解标注在类上的情况
@Conditional的扩展注解@ConditionalOnBean:仅仅在当前上下文中存在某个对象时,才会实例化一个Bean 。
@ConditionalOnClass:某个class位于类路径上,才会实例化一个Bean 。
@ConditionalOnExpression:当表达式为true的时候,才会实例化一个Bean 。
@ConditionalOnMissingBean:仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean 。
@ConditionalOnMissingClass:某个class类路径上不存在的时候,才会实例化一个Bean 。
@ConditionalOnNotWebApplication:不是web应用,才会实例化一个Bean 。
@ConditionalOnBean:当容器中有指定Bean的条件下进行实例化 。
@ConditionalOnMissingBean:当容器里没有指定Bean的条件下进行实例化 。
@ConditionalOnClass:当classpath类路径下有指定类的条件下进行实例化 。
@ConditionalOnMissingClass:当类路径下没有指定类的条件下进行实例化 。
@ConditionalOnWebApplication:当项目是一个Web项目时进行实例化 。
@ConditionalOnNotWebApplication:当项目不是一个Web项目时进行实例化 。
@ConditionalOnProperty:当指定的属性有指定的值时进行实例化 。
@ConditionalOnExpression:基于SpEL表达式的条件判断 。
@ConditionalOnJava:当JVM版本为指定的版本范围时触发实例化 。
@ConditionalOnResource:当类路径下有指定的资源时触发实例化 。
@ConditionalOnJndi:在JNDI存在的条件下触发实例化 。
@ConditionalOnSingleCandidate:当指定的Bean在容器中只有一个,或者有多个但是指定了首选的Bean时触发实例化 。
@Conditional 与@Profile 的对比Spring3.0 也有一些和@Conditional 相似的注解,它们是Spring SPEL 表达式和Spring Profiles 注解 Spring4.0的@Conditional 注解要比@Profile 注解更加高级 。@Profile 注解用来加载应用程序的环境 。@Profile注解仅限于根据预定义属性编写条件检查 。@Conditional注释则没有此限制 。
Spring中的@Profile 和 @Conditional 注解用来检查"If…then…else"的语义 。然而,Spring4 @Conditional是@Profile 注解的更通用法 。
- Spring 3中的 @Profile仅用于编写基于Environment变量的条件检查 。配置文件可用于基于环境加载应用程序配置 。
- Spring 4 @Conditional注解允许开发人员为条件检查定义用户定义的策略 。@Conditional可用于条件bean注册 。
项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation
推荐阅读
- Go如何保证gorountine执行完毕后继续执行
- Matlab如何调用动态连接库DLL文件的函数?
- SQL 中判断条件的先后顺序,会引起索引失效吗?
- 魏晋南北朝时期想要做官必须具备哪两个条件 魏晋南北朝什么选官制度
- 废旧电池如何处理
- 老茶头究竟能不能喝,如何冲泡老茶头
- 如何进行环保装修
- 无法重装系统?笔记本如何引导BIOS设置?
- HTTP长连接是啥?底层是如何工作的?Tomcat是如何实现长连接的?
- 如何科学地选择一台适合 Java 开发的电脑?