Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置。

本章大纲:

(1)例子说明
(2)编码思路
(3)编写条件类WindowCondition和LinuxCondition
(4)编写接口CmdService以及两个实现类
(5)编写配置类,根据条件进行注入不同的类
(6)编写测试代码
(7)Spring提供的Condition
(8)题外话:怎么在Condition中获取application.properties的配置项

接下里看下具体的内容:

(1)例子说明

在java中这种情况,调用系统的cmd命令,但是我们知道在window和linux下命令有些有些时候是不一样的,那么我们以前一般是这么处理;

//伪代码:
if(window){  //具体的处理代码
}else if(Linux){  //具体的处理代码.
}

当具体的处理代码很多的时候,我们会放到另外一个处理类来进行处理,比如:WindowService和LinuxService。你有没有发现这里如果我们使用了@Service进行注解WindowServie和LinuxService的话,那么内存中就会存在两个Service,而实际上有一个service根本一次都不会执行到。好了,针对于这个问题@Conditional就可以解决。当然它还有其它强大的地方。

(2)编码思路

  • 首先这里的话,有一个条件表达式的编写,满足什么条件下返回true,这个是接口Condition,我们需要去实现它;
  • 当满足条件的时候,进行做什么事情,这里使用的是@Conditional,当@Conditional(条件类.class)中的条件类返回true的时候,@Conditional所注解的类或者方法就会执行。

(3)编写条件类WindowCondition和LinuxCondition

WindowCondition:

package com.kfit.demo.condition;  import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;  /** * window操作系统的条件:当在Window系统下运行的时候,matches方法会返回true,否则返回false. */
public class WindowCondition implements Condition{  /** * 这里写自己的逻辑,只有返回true,才会启用配置 */   @Override  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {  return context.getEnvironment().getProperty("os.name").contains("Windows");  }
}

window操作系统的条件: 当在Window系统下运行的时候,matches方法会返回true,否则返回false.

LinuxCondition:

package com.kfit.demo.condition;  import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;  /** * Linux操作系统的条件:当在Linux系统下运行的时候,matches方法会返回true,否则返回false. */
public class LinuxCondition implements Condition{  /** * 这里写自己的逻辑,只有返回true,才会启用配置 */   @Override  public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {  return context.getEnvironment().getProperty("os.name").contains("Linux");  }  }  

Linux操作系统的条件: 当在Linux系统下运行的时候,matches方法会返回true,否则返回false.

(4)编写接口CmdService以及两个实现类

CmdService

package com.kfit.demo;  public interface CmdService {  public void print();
}

接口类,具体实现代码有两个service,WindowCmdService和LinuxCmdService。

WindowCmdService:

package com.kfit.demo.service;  import com.kfit.demo.CmdService;  public class WindowCmdService implements CmdService{  @Override  public void print() {  System.out.println("Window cmd...");  }  }

LinuxCmdService:

package com.kfit.demo.service;  import com.kfit.demo.CmdService;  public class LinuxCmdService implements CmdService{  @Override  public void print() {  System.out.println("Linux cmd...");  }  }

注意:以上的两个实现类WindowCmdService和LinuxCmdService这里我们并没有使用@Service注解进行注入,下面我们使用配置类根据不同的系统注入不同的类。

(5)编写配置类,根据条件进行注入不同的类

CmdServiceConditionConfig:

package com.kfit.demo.config;  import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;  import com.kfit.demo.CmdService;
import com.kfit.demo.condition.LinuxCondition;
import com.kfit.demo.condition.WindowCondition;
import com.kfit.demo.service.LinuxCmdService;
import com.kfit.demo.service.WindowCmdService;  /** * 条件配置类. */
@Configuration
public class CmdServiceConditionConfig {  /** * 当WindowCondition方法中的matches返回true的时候, * WindowCmdService会被注入,否则不注入。 */  @Bean("cmdService")  @Conditional(WindowCondition.class)  public CmdService windowCmdService(){  return new WindowCmdService();  }  /** * 当LinuxCondition方法中的matches返回true的时候, * LinuxCmdService会被注入,否则不注入。 */  @Bean("cmdService")  @Conditional(LinuxCondition.class)  public CmdService LinuxCmdService(){  return new LinuxCmdService();  }
}

这里使用@Conditional根据满足不同的条件注入不同的类,在Linux下会注入实现类LinuxCmdService,在Window下会注入WindowCmdService。

(6)编写测试代码

在启动类的main方法中编写测试代码:


public static void main(String[] args) {  ApplicationContext ctx =  (ApplicationContext) SpringApplication.run(App.class, args);  CmdService cmdService = ctx.getBean(CmdService.class);  cmdService.print();  }  

在Window下运行控制台打印信息:

 Window cmd...

在Linux下运行控制台打印信息(亲测):

Linux cmd...

(7)Spring提供的Condition

除了自己自定义Condition之外,Spring还提供了很多Condition给我们用

  • @ConditionalOnBean
    仅仅在当前上下文中存在某个对象时,才会实例化一个Bean。
  • @ConditionalOnClass
    某个class位于类路径上,才会实例化一个Bean
  • @ConditionalOnExpression
    当表达式为true的时候,才会实例化一个Bean。

比如:

@ConditionalOnExpression("true")
@ConditionalOnExpression("${my.controller.enabled:false}")
  • @ConditionalOnMissingBean
    仅仅在当前上下文中不存在某个对象时,才会实例化一个Bean
  • @ConditionalOnMissingClass
    某个class类路径上不存在的时候,才会实例化一个Bean
  • @ConditionalOnNotWebApplication
    不是web应用

(8)Condition中获取application.properties的配置项

在实际开发中,我们的条件可能保存在application.properties中,那么怎么在Condition中获取呢,这个很简单,主要通过ConditionContext进行获取,具体代码如下:

String port = context.getEnvironment().getProperty("server.port");
System.out.println(port);

@Conditional、ConditionalOnClass和ConditionalOnBean注解相关推荐

  1. springboot的@ConditionalOnBean注解

    上篇文章中分析了springboot的自动注入的原理,可在文章后面的推荐阅读中温习哦.在自动注入的原理那篇文章中提到了@ConditionalOnXX注解,今天来看下springboot中的@Cond ...

  2. @Conditional、@ConditionalOnClass 等条件注解的作用

    Spring 4框架的新特性:@Conditional注释,此注释使得只有在特定条件满足时才启用一些配置. 目录: (1)例子说明 (2)编码思路 (3)编写条件类WindowCondition和Li ...

  3. 12、常见Conditional注解源码解析-ConditionalOnBean(写作中...)

    ConditionalOnBean 源码解析 ConditionalOnBean 注解 看看 ConditionalOnBean 注解 @Conditional(OnBeanCondition.cla ...

  4. Spring 条件组件注解:`@Conditional` 与 `@ConditionalOnBean`

    Spring 条件组件注解:@Conditional 与 @ConditionalOnBean 文章目录 Spring 条件组件注解:`@Conditional` 与 `@ConditionalOnB ...

  5. 条件注解 @ConditionalOnBean 的正确使用姿势

    本文转载于公众号"吉姆餐厅ak" 条件注解是Spring4提供的一种bean加载特性,主要用于控制配置类和bean初始化条件.在springBoot,springCloud一系列框 ...

  6. Spring系列(六):@Conditional注解用法介绍

    今天给大家介绍@Conditional懒加载注解用法,希望对大家能有所帮助! 1.@Conditional注解介绍 @Conditional是Spring4版本新提供的一种注解,它的作用是按照设定的条 ...

  7. SpringBoot @ConditionalOnBean、@ConditionalOnMissingBean注解源码分析与示例

    前言: Spring4推出了@Conditional注解,方便程序根据当前环境或者容器情况来动态注入bean 继@Conditional注解后,又基于此注解推出了很多派生注解,比如@Condition ...

  8. SpringBoot之conditional注解

    @Conditional介绍 首先我们先了解一下@Conditional注解,@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,需要注入的Bean满足给定条件才可 ...

  9. 详解Spring Boot框架中的@Conditional系列注解

    目录 1. @Conditional 注解 2. Spring boot 扩展 1) @ConditionalOnClass和@ConditionalOnMissingClass注解 2) @Cond ...

最新文章

  1. 什么是薪火相传,民族复兴接力运动员
  2. Redis架构第二天:CenterOS集群、RDB和AOF、主从复制架构实践
  3. Codevs 1005 生日礼物
  4. pandas中的括号索引
  5. linux命令使用示例:查看某目录属于哪个分区
  6. 【转】09.认识一下Qt用到的开发工具
  7. 产品经理装逼词汇大全
  8. c# Net XML文档(2,2)中有错误
  9. 四平方和蓝桥杯Java_蓝桥杯-四平方和问题
  10. 新手学编程必会的100个代码
  11. Java实现二维码的生成
  12. 脚本精灵for+android,脚本精灵 v3.0.8
  13. 华为展望5G未来 安全问题成关键
  14. 交换机 路由器模拟仿真软件命令
  15. [javascript] Box2D JS初探(一个控制小球的游戏例子)。学习用!
  16. 每日一题-75(向公司CEO汇报工作的所有人)
  17. 下载并安装 Node
  18. 三分钟部署Laxcus大数据管理系统
  19. Java的Io模型你了解多少?linuxmysql安装位置
  20. 解决Microsoft 365和Visio冲突问题

热门文章

  1. 编程十年,在海外成为全栈程序员是怎样一种体验?
  2. 可变数据软件如何批量打印合格证
  3. [原创]利用橡皮条技术画图
  4. 【UE4】 html中 ue4与 js数据互通
  5. (六)坦克大战--(4)炮弹爆炸与生命值
  6. 流量回放开源代码Java_流量回放原理
  7. Python数据采集与文本分析(学术)
  8. 分销商城小程序开发及解决方案
  9. UNAS折腾:raidriver映射webdav作为本地盘
  10. 编程语言1月排行榜:C是年度语言,Python增长量第二