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()方法的使用