zoukankan      html  css  js  c++  java
  • 17点睛Spring4.1-@Conditional

    17.1 @Conditional

    • @Conditional为按照条件配置spring的bean提供了支持,即满足某种条件下,怎么配置对应的bean;
    • 应用场景
      • 当某一个jar包在classpath中的时候,配置某几个bean;
      • 当某一个bean配置好后,会自动配置一个特定的bean;
      • 当某种环境变量被设置后,创建某个bean;
    • @Conditional为敏捷开发所提倡的原则"习惯优于配置"提供了支持;
    • @Conditional是Spring Boot快速开发框架实现"习惯优于配置"的核心技术;

    17.2 示例

    演示在windows和linux系统下,初始化不同的bean,windows和linux作为判断条件;

    17.2.1 构造判断条件

    条件的构造需要类实现Condition接口,并实现matches方法

    • WindowsCondition
    package com.wisely.conditional;
    
    import org.springframework.context.annotation.Condition;
    import org.springframework.context.annotation.ConditionContext;
    import org.springframework.core.type.AnnotatedTypeMetadata;
    
    public class WindowsCondition implements Condition {
    
        public boolean matches(ConditionContext context,
                AnnotatedTypeMetadata metadata) {
            return context.getEnvironment().getProperty("os.name").contains("Windows");
        }
    
    }
    
    • LinuxCondition
    package com.wisely.conditional;
    
    import org.springframework.context.annotation.Condition;
    import org.springframework.context.annotation.ConditionContext;
    import org.springframework.core.type.AnnotatedTypeMetadata;
    
    public class LinuxCondition implements Condition {
    
        public boolean matches(ConditionContext context,
                AnnotatedTypeMetadata metadata) {
            return context.getEnvironment().getProperty("os.name").contains("Linux");
        }
    
    }
    

    17.2.2 编写不同条件下需要的bean

    • 接口
    package com.wisely.conditional;
    
    
    public interface CommandService {
    
        public String showListCommand();
    }
    
    • WindowsCommnadService
    package com.wisely.conditional;
    
    public class WindowsCommnadService implements CommandService {
    
        public String showListCommand() {
            return "dir";
        }
    
    }
    
    • LinuxCommandService
    package com.wisely.conditional;
    
    public class LinuxCommandService implements CommandService {
    
        public String showListCommand() {
            return "ls";
        }
    
    }
    

    17.2.3 编写配置类

    package com.wisely.conditional;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Conditional;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class DemoConfig {
        @Bean
        @Conditional(WindowsCondition.class)
        public CommandService commandService() {
            return new WindowsCommnadService();
        }
    
        @Bean
        @Conditional(LinuxCondition.class)
        public CommandService linuxEmailerService() {
            return new LinuxCommandService();
        }
    
    }
    

    17.2.4 测试

    • windows下
    package com.wisely.conditional;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            AnnotationConfigApplicationContext context =
                    new AnnotationConfigApplicationContext("com.wisely.conditional");
            CommandService cs = context.getBean(CommandService.class);
            System.out.println(cs.showListCommand());
            context.close();
        }
    }
    

    输出结果

    dir
    • Linux下(本例没有切换到linux,直接修改os.name为Linux)
    package com.wisely.conditional;
    
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    
    public class Main {
    
        public static void main(String[] args) {
            System.setProperty("os.name", "Linux");
            AnnotationConfigApplicationContext context =  new AnnotationConfigApplicationContext("com.wisely.conditional");
            CommandService cs = context.getBean(CommandService.class);
            System.out.println(cs.showListCommand());
            context.close();
    
        }
    }
    

    输出结果

  • 相关阅读:
    前进的道路,不要往后看——记得24生日
    【剑指offer】:Q44:直扑克
    手游client思考框架
    Craig可能是个冲浪爱好者
    VMware vSphere服务器虚拟化实验六 vCenter Server 添加储存
    OSX: 使用命令行对FileVault2分区恢复
    让工程师爱上CMMI,实现管理于无形 --- 中标软件CMMI L5之路 (1/2)
    让工程师爱上CMM,实现管理于无形 --- 中标软件CMMI L5之路 (2/2)
    HTML+CSS实例——漂亮的查询部件(一)
    jbpm部署流程定义到MySql报乱码解决方案
  • 原文地址:https://www.cnblogs.com/Jeely/p/11949999.html
Copyright © 2011-2022 走看看