Spring 4.0新功能:@Conditional注解详细介绍
发布时间 - 2026-01-11 03:07:48 点击率:次前言

最近在学习spring,抽空会将学习的知识总结下面,本文我们会接触spring 4的新功能:@Conditional注解。在之前的spring版本中,你处理conditions只有以下两个方法:
- 在3.1版本之前,你需要使用spring expression language
- 在3.1版本发布时,profiles被引入来处理conditions。
让我们分别看看以上两者,在来理解spring 4带来的@Conditional注解。
Spring Expression Language(SPeL)
SPeL的三元标识符(IF-THEN-ELSE)可以在spring配置文件中用来表达条件语句。
<bean id="flag">
<constructor-arg value="#{systemProperties['system.propery.flag'] ?: false }" />
</bean>
<bean id="bean">
<property name="property" value="#{ flag ? 'yes' : 'no' }"/>
</bean>
这个bean的属性依赖于flag的值,该值是使用外部属性注入的,这样bean就具有了动态的能力。
使用 Profiles
这是在spring 3.1引入的。像下面这样使用。
<!-- default configuration - will be loaded if no profile is specified --> <!-- This will only work if it's put at the end of the configuration file --> <!-- so no bean definitions after that --> <beans profile="default"> <import resource="classpath:default.xml" /> </beans> <!-- some other profile --> <beans profile="otherProfile"> <import resource="classpath:other-profile.xml" /> </beans>
使用spring 4的@Conditional注解
现在介绍@Conditional注解。官方文档的说明是“只有当所有指定的条件都满足是,组件才可以注册”。主要的用处是在创建bean时增加一系列限制条件。
Conditional接口的声明如下:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE, ElementType.METHOD)
public @interface Conditional{
Class <!--?extends Condition-->[] value();
}
所以@Conditional注解使用方法如下
- 类型级别,可以在@Component 或是 @Configuration类上使用
- 原型级别,可以用在其他自定义的注解上
- 方法级别,可以用在@Bean的方法上
如果一个@Configuration类使用了@Conditional,会影响所有@Bean方法和@Import关联类
public interface Condition{
/** Determine if the condition matches.
* @param context the condition context
* @param metadata meta-data of the {@link AnnotationMetadata class} or
* {@link Method method} being checked.
* @return {@code true} if the condition matches and the component can be registered
* or {@code false} to veto registration.
*/
boolean matches(ConditionContext context, AnnotatedTypeMedata metadata);
}
下面是一个例子
public class SystemPropertyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return (System.getProperty("flag") != null);
}
}
class SystemPropertyAbsentCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return (System.getProperty("flag") == null);
}
}
这里我们有两个类:SystemPropertyCondition和SystemPropertyAbsentCondtion. 这两个类都实现了Condition接口.覆盖的方法基于属性flag返回一个布尔值。
现在我们定义两个类,一个是positive条件,一个是negative条件:
@Bean
@Conditional(SystemPropertyCondition.class)
public SampleService service1() {
return new SampleServiceImpl1();
}
@Bean
@Conditional(SystemPropertyAbsentCondition.class)
public SampleService service2() {
return new SampleServiceImpl2();
}
上面提到的profiles已经通过conditional原型注解进行了修改。
总结
本文介绍了spring 4的conditianal注解。注意condition注解是不会继承的。如果一个父类使用了conditional注解,其子类是不会拥有conditions的。如果你动手尝试以上的例子,会帮助你获得更好的理解。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# conditional注解
# spring4.0
# 注解
# spring
# conditional
# Spring Boot中@ConditionalOnProperty的使用方法
# 使用@ConditionalOnProperty控制是否加载的操作
# Spring Boot conditional注解用法详解
# 关于@ConditionalOnProperty的作用及用法说明
# 用在
# 是一个
# 这是
# 如果你
# 使用了
# 是在
# 好了
# 让我们
# 子类
# 这两个
# 才可以
# 自定义
# 这篇文章
# 谢谢大家
# 会将
# 配置文件
# 进行了
# 方法如下
# 实现了
# 文档
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
iOS UIView常见属性方法小结
如何解决hover在ie6中的兼容性问题
微信h5制作网站有哪些,免费微信H5页面制作工具?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
深圳网站制作培训,深圳哪些招聘网站比较好?
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Laravel如何操作JSON类型的数据库字段?(Eloquent示例)
google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤
php打包exe后无法访问网络共享_共享权限设置方法【教程】
Laravel Blade组件怎么用_Laravel可复用视图组件的创建与使用
如何彻底卸载建站之星软件?
Laravel项目怎么部署到Linux_Laravel Nginx配置详解
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
Laravel如何创建和注册中间件_Laravel中间件编写与应用流程
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
如何确认建站备案号应放置的具体位置?
网站优化排名时,需要考虑哪些问题呢?
高防服务器租用如何选择配置与防御等级?
Bootstrap CSS布局之列表
,在苏州找工作,上哪个网站比较好?
如何在IIS服务器上快速部署高效网站?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
制作旅游网站html,怎样注册旅游网站?
太平洋网站制作公司,网络用语太平洋是什么意思?
微信小程序 配置文件详细介绍
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
如何在IIS7上新建站点并设置安全权限?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
Laravel如何配置和使用缓存?(Redis代码示例)
如何在宝塔面板中修改默认建站目录?
专业商城网站制作公司有哪些,pi商城官网是哪个?
如何在阿里云服务器自主搭建网站?
Laravel路由Route怎么设置_Laravel基础路由定义与参数传递规则【详解】
android nfc常用标签读取总结
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
如何快速生成专业多端适配建站电话?
EditPlus中的正则表达式 实战(1)
Laravel怎么配置.env环境变量_Laravel生产环境敏感数据保护与读取【方法】
如何挑选优质建站一级代理提升网站排名?
如何在阿里云虚拟主机上快速搭建个人网站?
Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践
如何在服务器上配置二级域名建站?
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
Laravel如何集成第三方登录_Laravel Socialite实现微信QQ微博登录
如何在宝塔面板中创建新站点?
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
详解jQuery停止动画——stop()方法的使用

