Spring 4.0新功能:@Conditional注解详细介绍

 更新时间:2017年09月06日 10:29:06   作者:沈子平  
Spring Boot的强大之处在于使用了Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置。下面这篇文章主要给大家介绍了关于Spring4.0中新功能:@Conditional注解的相关资料,需要的朋友可以参考下。

前言

最近在学习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的。如果你动手尝试以上的例子,会帮助你获得更好的理解。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

相关文章

  • Spring boot2.0 实现日志集成的方法(2)

    Spring boot2.0 实现日志集成的方法(2)

    这篇文章主要介绍了Spring boot2.0 实现日志集成的方法,上一章讲解了spring boot日志简单集成,这篇我们将日志进行分类,常规日志、异常日志、监控日志等,需要将日志输出到不同的文件,具体内容需要的小伙伴可以参考一下
    2022-04-04
  • Java基础之教你怎么用代码一键生成POJO

    Java基础之教你怎么用代码一键生成POJO

    这篇文章主要介绍了Java基础之教你怎么用代码一键生成POJO,文中有非常详细的代码示例,对正在学习Java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • 详细聊聊SpringBoot中动态切换数据源的方法

    详细聊聊SpringBoot中动态切换数据源的方法

    在大型分布式项目中,经常会出现多数据源的情况,下面这篇文章主要给大家介绍了关于SpringBoot中动态切换数据源的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-09-09
  • JDBC链接数据库的几个步骤

    JDBC链接数据库的几个步骤

    这篇文章主要介绍了JDBC链接数据库的几个步骤,通过将数据库的连接放在一个工具类里面,达到重用的效果,需要的朋友可以参考下
    2015-07-07
  • Springboot实现Excel批量导入数据并保存到本地

    Springboot实现Excel批量导入数据并保存到本地

    这篇文章主要为大家详细介绍了Springboot实现Excel批量导入数据并将文件保存到本地效果的方法,文中的示例代讲解详细,需要的可以参考一下
    2022-09-09
  • 一文彻底弄懂零拷贝原理以及java实现

    一文彻底弄懂零拷贝原理以及java实现

    零拷贝(英语: Zero-copy) 技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域,下面这篇文章主要给大家介绍了关于零拷贝原理以及java实现的相关资料,需要的朋友可以参考下
    2021-08-08
  • 关于kafka消费不到远程bootstrap-server 数据的问题

    关于kafka消费不到远程bootstrap-server 数据的问题

    很多朋友遇到kafka消费不到远程bootstrap-server 数据的问题,怎么解决这个问题,很多朋友不知所措,下面小编给大家带来了关于kafka消费不到远程bootstrap-server 数据的问题及解决方法,感兴趣的朋友跟随小编一起看看吧
    2021-11-11
  • Java中properties文件中的中文乱码问题

    Java中properties文件中的中文乱码问题

    Properties为了方便用户的配置,用于读取Java的配置文件,不同的编程语言有自己所支持的配置文件,能让用户够脱离程序本身去修改相关的变量设置,这篇文章主要介绍了Java中properties文件中的中文乱码问题,需要的朋友可以参考下
    2023-08-08
  • 教你怎么用java实现客户端与服务器一问一答

    教你怎么用java实现客户端与服务器一问一答

    这篇文章主要介绍了教你怎么用java实现客户端与服务器一问一答,文中有非常详细的代码示例,对正在学习java的小伙伴们有非常好的帮助,需要的朋友可以参考下
    2021-04-04
  • idea 普通文件夹 转换成 module操作

    idea 普通文件夹 转换成 module操作

    这篇文章主要介绍了idea 普通文件夹 转换成 module操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08

最新评论