文档章节

Spring 条件注解 @Conditional

吴伟祥
 吴伟祥
发布于 2018/08/22 16:02
字数 506
阅读 26
收藏 3

Spring 4提供了一个更通用的基于条件的Bean的创建方式,即使用@Conditional注解。

下面的示例将以不同的操作系统作为条件,我们将通过实现Condition接口,并重写其matches方法来构造判断条件。如在Windows系统下运行程序输出dir,Linux下输出ls。

一、不同系统下的Bean

1、声明接口

package cn.wuweixiang.springbootdemo.service;

/**
 * ListService
 *
 * @author weixiang.wu
 * @date 2018 -08-22 15:39
 */
public interface ListService {
	/**
	 * Show list cmd string.
	 *
	 * @return the string
	 */
	String showListCmd();
}

2、Windows下所要创建的Bean

package cn.wuweixiang.springbootdemo.service.impl;

import cn.wuweixiang.springbootdemo.service.ListService;

/**
 * WindowsListServiceImpl
 *
 * @author weixiang.wu
 * @date 2018-08-22 15:40
 **/
public class WindowsListServiceImpl implements ListService {
	@Override
	public String showListCmd() {
		return "dir";
	}
}

3、Linux下所要创建的Bean

package cn.wuweixiang.springbootdemo.service.impl;

import cn.wuweixiang.springbootdemo.service.ListService;

/**
 * LinuxListServiceImpl
 *
 * @author weixiang.wu
 * @date 2018-08-22 15:42
 **/
public class LinuxListServiceImpl implements ListService {
	@Override
	public String showListCmd() {
		return "ll";
	}
}

二、判断条件定义

package cn.wuweixiang.springbootdemo.condition;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.util.Objects;

/**
 * ConditionalConfig
 *
 * @author weixiang.wu
 * @date 2018-08-22 15:55
 **/
public class LinuxCondition implements Condition {


	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		return Objects.requireNonNull(context.getEnvironment().getProperty("os.name")).contains("Linux");
	}
}
package cn.wuweixiang.springbootdemo.condition;

import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.type.AnnotatedTypeMetadata;

import java.util.Objects;

/**
 * ConditionalConfig
 *
 * @author weixiang.wu
 * @date 2018-08-22 15:55
 **/
public class WindowsCondition implements Condition {


	@Override
	public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
		return Objects.requireNonNull(context.getEnvironment().getProperty("os.name")).contains("Windows");
	}
}

三、配置类

package cn.wuweixiang.springbootdemo.config;

import cn.wuweixiang.springbootdemo.condition.LinuxCondition;
import cn.wuweixiang.springbootdemo.condition.WindowsCondition;
import cn.wuweixiang.springbootdemo.service.ListService;
import cn.wuweixiang.springbootdemo.service.impl.LinuxListServiceImpl;
import cn.wuweixiang.springbootdemo.service.impl.WindowsListServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;

/**
 * ConditionalConfig
 *
 * @author weixiang.wu
 * @date 2018 -08-22 15:55
 */
public class ConditionalConfig {

	/**
	 * 使用@Conditional注解,符合Linux条件就实例化LinuxListService
	 *
	 * @return the list service
	 */
	@Bean
	@Conditional(LinuxCondition.class)
	public ListService linuxListService() {
		return new LinuxListServiceImpl();
	}

	/**
	 * 使用@Conditional注解,符合Windows条件就实例化WindowsListService
	 *
	 * @return the list service
	 */
	@Bean
	@Conditional(WindowsCondition.class)
	public ListService windowsListService() {
		return new WindowsListServiceImpl();
	}

}

四、测试类

package cn.wuweixiang.springbootdemo;

import cn.wuweixiang.springbootdemo.config.ConditionalConfig;
import cn.wuweixiang.springbootdemo.service.ListService;
import org.junit.After;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

/**
 * SpringConditionalTest
 *
 * @author weixiang.wu
 * @date 2018-08-22 16:00
 **/
public class SpringConditionalTest {

	AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConditionalConfig.class);

	@Test
	public void contextTest() {
		ListService listService = context.getBean(ListService.class);

		System.out.println(context.getEnvironment().getProperty("os.name")
				+ "系统下的列表命令为:"
				+ listService.showListCmd());
	}

	@After
	public void closeContext() {
		context.close();
	}

}

 

© 著作权归作者所有

吴伟祥

吴伟祥

粉丝 34
博文 500
码字总数 285677
作品 0
泉州
后端工程师
私信 提问
加载中

评论(0)

Spring Boot 2 实战:根据条件来自动配置不同逻辑的Bean

前言 我们经常会有根据条件来加载不同的接口。比如你查询目录下文件列表, Windows 下你会用 的 命令,而 Linux 下你会使用 命令。 熟悉 Spring Boot 自动配置的也知道 Spring Boot 能根据不...

码农小胖哥
2019/10/21
61
0
Spring Boot 最核心的 25 个注解,都是干货!

学习和应用 Spring Boot 有一些时间了,你们对 Spring Boot 注解了解有多少呢?今天栈长我给大家整理了 Spring Boot 最核心的 25 个注解,都是干货! 你所需具备的基础 什么是 Spring Boot?...

Java技术栈
2019/02/26
270
0
终于有人总结Spring Boot最常用的25个注解,干货了解一下!

1、@SpringBootApplication 这是 Spring Boot 最最最核心的注解,用在 Spring Boot 主类上,标识这是一个 Spring Boot 应用,用来开启 Spring Boot 的各项能力。 其实这个注解就是 @SpringB...

我最喜欢三大框架
2019/04/27
25
0
SpringBoot系列之@Conditional注解用法简介

SpringBoot系列之@Conditional注解用法简介 引用Spring官方文档的说法介绍一下@Conditional注解:Spring5.0.15版本@Conditional注解官方文档 @Conditional表示仅当所有指定条件都匹配时,组件...

smileNicky
2019/11/16
0
0
Spring Boot是如何实现自动配置的

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

技术小能手
2018/07/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

这15个Vue指令,让你的项目开发爽到爆

受 AngularJS 的启发,Vue 内置了一些非常有用的指令(比如v-html 和 v-once等),每个指令都有自身的用途。完整的指令列表可以在这里查看. 这还没完,更棒的是可以开发自定义指令。Vue.js ...

李中凯
19分钟前
37
0
HTTP与HTTPS的区别

超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以...

无名氏的程序员
24分钟前
45
0
如何在A4纸张尺寸页面中制作HTML页面?

是否可以使HTML页面的行为类似于MS Word中的A4大小的页面? 本质上,我希望能够在浏览器中显示HTML页面,并以A4尺寸页面的尺寸概述内容。 为了简单起见,我假设HTML页面仅包含文本(没有图像...

javail
33分钟前
28
0
工作流-变量

流程变量的作用: 用来传递业务参数(比如请假天数,请假原因等); 指定连线完成任务(同意和拒绝); 动态指定任务的办理人. 流程变量要用的表: act_ru_variable; -- 正在执行的流程变量表...

小小明1995
34分钟前
49
0
JVM解毒——类加载子系统

带着问题,尤其是面试问题的学习才是最高效的。加油,奥利给! 点赞+收藏 就学会系列,文章收录在 GitHub JavaEgg ,N线互联网开发必备技能兵器谱 直击面试 看你简历写得熟悉JVM,那你说说类...

大猿帅
43分钟前
37
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部