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();

}

}

转载至链接:https://my.oschina.net/wuweixiang/blog/1932216

java 按条件注解_Spring 条件注解 @Conditional相关推荐

  1. spring多参java注解_spring参数注解校验

    在写一些controller协议的时候,有些时候从前端传过来的参数较多,好的办法是定义一个实体类来封装请求参数,但是用实体类封装参数后,无法对参数值进行校验,可以使用spring的@Validated ...

  2. @aspect注解_Spring自定义注解玩法大全,从入门到放弃

    在业务开发过程中我们会遇到形形色色的注解,但是框架自有的注解并不是总能满足复杂的业务需求,我们可以自定义注解来满足我们的需求. 根据注解使用的位置,文章将分成字段注解.方法.类注解来介绍自定义注解. ...

  3. java filter 注解_Spring常用注解及自定义Filter的实现

    @Configuration通常用在配置类上,告诉spring这是一个配置类(配置类类似配置文件,区别在于用类的形式来表现xml: @Service用于标注业务层组件service层, @Contro ...

  4. java mvc 注解_Spring MVC注解开发入门

    注解式开发初步 常用的两个注解: @Controller:是SpringMVC中最常用的注解,它可以帮助定义当前类为一个Spring管理的bean,同时指定该类是一个控制器,可以用来接受请求.标识当前 ...

  5. java自动注入注解_Spring自动注解标签@Autowired不能注入xml配置的bean吗?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 配置service的xml service代码 public class LoginServiceImpl extends BaseDaoServiceI ...

  6. Mybatis多条件直接查询Param注解版

    1.UserMapper接口 package com.william.dao;import com.william.domain.QueryValueObject; import com.willia ...

  7. java中spring的注解_spring中的各种注解解析

    Spring中的注解大概可以分为两大类: 1)spring的bean容器相关的注解,或者说bean工厂相关的注解: 2)springmvc相关的注解. spring的bean容器相关的注解,先后有:@ ...

  8. Java注解配置rest服务_Spring Boot 注解—常用注解

    注:该部分内容包含一些常用注解,如果没有学习过java注解的同学可以先看一下上一小节的内容Spring Boot 注解-基本知识 ,不看也没关系,下面就开始本节内容. @Configuration注解 ...

  9. java spring框架 注解_spring框架之注解的使用

    原标题:spring框架之注解的使用 今天是刘小爱自学Java的第122天. 感谢你的观看,谢谢你. 学习内容安排如下: Spring注解的使用. JavaWeb项目的搭建. Spring的Web集成 ...

最新文章

  1. go标准库的学习-sync互斥
  2. leetcode28. Implement strStr() (以及个人对KMP算法理解)
  3. Linux 2.6内核配置说明(Networking网络)
  4. 安川交流伺服电机的驱动
  5. Java文件上传如何实现呢?
  6. 【实战 Ids4】║ 控制台密码模式搭配Ocelot网关
  7. 【转载】Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题
  8. 【Java用法】java 8两个List集合取交集、并集、差集、去重并集
  9. 检查linux是否安装rar,rarlinux的安装及使用
  10. Tableau教程——一
  11. C语言程序设计之小超市管理系统
  12. 数字基础设施可视化管理,任重而道远
  13. 【黄啊码】fastadmin接入微信支付和支付宝支付
  14. DiscuzX 数据字典 超详细
  15. 汽车租赁系统 ssm
  16. Python编写一个程序来计算 BMI 值。
  17. cufflinks修改使用
  18. 曹晋睿 受邀担任第七届少儿模特明星盛典亲善大使
  19. 官方完整HL7 ECG-XML例子及注释翻译(1)
  20. 手机html5游戏内存修改,一种防止游戏被内存修改器修改的方法

热门文章

  1. MySQL为表添加外键约束
  2. 一款小清新的 SpringBoot+ Mybatis 前后端分离后台管理系统项目
  3. 基于SpringBoot+Vue前后端分离管理系统
  4. can not open include file afxwin.h :no such header fileor directory in vs 2015 c++
  5. “面试不败计划”: java语言基础面试题(一)
  6. Java提升篇:理解String 及 String.intern() 在实际中的应用
  7. 数据结构之排序算法(一)-堆排序
  8. OJDBC版本区别 [ojdbc14.jar,ojdbc5.jar和ojdbc6.jar的区别]
  9. stm32采集正弦波峰峰值_科研项目 | 基于STM32的永磁同步电机SVPWM控制设计
  10. ant design vue input change_Ant-design-vue项目实现动态路由