文档章节

使用@Conditional条件注解

FEINIK
 FEINIK
发布于 2017/02/14 21:34
字数 318
阅读 90
收藏 0

1. @Conditional注解根据满足的条件来创建一个特定的Bean

2. 示例,以不同的操作系统为条件,通过实现Condition接口,并重写matches方法来构造判断条件,若在Windows系统下运行程序,则输出命令dir, 若在Linux系统下运行则输出 ls

3. 编写判断Windows的条件类

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.stereotype.Service;
@Service
public class WindowsCondition implements Condition {
   @Override
   public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
      return context.getEnvironment().getProperty("os.name").contains("Windows");
   }
}

4. 编写判断Linux的条件类

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;
import org.springframework.stereotype.Service;
@Service
public class LinuxCondition implements Condition {
   @Override
   public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
      return context.getEnvironment().getProperty("os.name").contains("Linux");
   }
}

5. 不同系统下Bean的共同接口

public interface ListCmdService {
   public String showCmd();
}

6. Windows系统下创建的Bean类

public class ListWindowsCmd implements ListCmdService {
   @Override
   public String showCmd() {
      return "dir";
   }
}

7. Linux系统下创建的Bean类

public class ListLinuxCmd implements ListCmdService {
   @Override
   public String showCmd() {
      return "ls";
   }
}

8. 配置类

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ConditionConfig {

   @Bean
   @Conditional(WindowsCondition.class)
   public ListCmdService listWindowsCmd() {
      return new ListWindowsCmd();
   }

   @Bean
   @Conditional(LinuxCondition.class)
   public ListCmdService listLinuxCmd() {
      return new ListLinuxCmd();
   }
}

代码解释:@Conditional注解,符合WindowsCondition条件则创建ListWindowsCmd实例,符合LinuxCondition条件则创建ListLinuxCmd实例

9. 运行

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class Main {
   public static void main(String[] args) {
      AnnotationConfigApplicationContext context = new
            AnnotationConfigApplicationContext(ConditionConfig.class);
      ListCmdService listCmdService = context.getBean(ListCmdService.class);
      System.out.println(context.getEnvironment().getProperty("os.name") +
            " 系统命令:" + listCmdService.showCmd());
   }
}

 

© 著作权归作者所有

共有 人打赏支持
FEINIK
粉丝 225
博文 58
码字总数 55195
作品 0
广州
高级程序员
私信 提问
Spring注解——使用@Conditional来按照条件注册bean

1.有时候需要根据不同条件生成不同的 bean,这时候就需要用到 @Conditional 注解。常见的一种用法,就是根据操作系统类型,注册不同的 bean。在 BeanConfig 配置类中增加三个 bean。 查看当前...

冯先生的笔记
2018/06/24
0
0
SpringBoot系列二:SpringBoot自动配置原理

原文出处:晴枫 1 SpringBoot运作原理 上一章中我们提到主程序类的注解 @SpringBootApplication 注解,它其实是个组合注解,源码如下: @Target({ElementType.TYPE})@Retention(RetentionPol...

晴枫
2018/11/21
0
0
Spring Boot 自动配置的 “魔法” 是如何实现的?

原文出处:sylvanassun Spring Boot是Spring旗下众多的子项目之一,其理念是约定优于配置,它通过实现了自动配置(大多数用户平时习惯设置的配置作为默认配置)的功能来为用户快速构建出标准...

sylvanassun
2018/06/10
0
0
SpringBoot基础篇Bean之条件注入@Condition使用姿势

更多Spring文章,欢迎点击 一灰灰Blog-Spring专题 前面几篇关于Bean的基础博文中,主要集中在Bean的定义和使用,但实际的情况中有没有一些场景是不加载我定义的bean,或者只有满足某些前提条...

小灰灰Blog
2018/10/21
0
0
springBoot注解@Conditional

官方文档定义:“Indicates that a component is only eligible for registration when all specified conditions match”,意思是只有满足一些列条件之后创建一个bean。 @Conditional定义 ...

xiaomin0322
2018/01/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【Python3之异常处理】

一、错误和异常 1.错误 代码运行前的语法或者逻辑错误 语法错误(这种错误,根本过不了python解释器的语法检测,必须在程序执行前就改正) def test: ^SyntaxError: invalid...

dragon_tech
7分钟前
0
0
编写可维护的 JavaScript

几乎每个程序员都有接手维护别人遗留项目的经历。或者,有可能一个老项目某一天又被重新启动。 通常情况下,接手老项目都会让人恨不得抛弃掉整个代码库从头开始。老代码凌乱、文档缺失、需要...

前端小攻略
19分钟前
0
0
Amino——框架层

框架层 目录 框架层... 1 Amino. 2 (一)、首页(TAB1)... 2 (二)、聊天(TAB2)... 3 (三)、我的社区(TAB3)... 5 (四)、探索(TAB4)... 6 (五)、钱包... 7 兴趣部落... 8 (一...

铸剑为犁413
37分钟前
0
0
k8s-dashboard

Kubernetes Dashboard 是一个管理Kubernetes集群的全功能Web界面,旨在以UI的方式完全替代命令行工具(kubectl 等) kubectl apply -f http://mirror.faasx.com/kubernetes/dashboard/master...

ZH-JSON
43分钟前
1
0
python如何安装库命令

python3 -m pip install 库名称

怪咖先生forever
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部