zoukankan      html  css  js  c++  java
  • 峰哥说技术: 05Spring Boot条件注解注解

    Spring Boot深度课程系列

    峰哥说技术—2020庚子年重磅推出、战胜病毒、我们在行动

    05 峰哥说技术  Spring Boot条件注解

    @EnableAutoConfiguration开启自动化配置,零配置就能运行,那么它的原理是什么?要理解这个,必须首先理解什么是条件注解。抛开 Spring Boot,我们来单纯的看看在 Spring 中条件注解的用法。首先我们来创建一个普通的 Maven 项目,然后引入 spring-context,如下

     

    1)创建一个接口Food

    package com.java;
    public interface Food {
        String showName();
    }

    2)创建impl包,创建Food接口的两个实现类RiceNoodles

    package com.java.impl;

    import com.java.Food;

    public class Rice implements Food {
        @Override
        public String showName() {
            return "米饭";
        }
    }

    package com.java.impl;

    import com.java.Food;

    public class Noodles implements Food {
        @Override
        public String showName() {
            return "面条";
        }
    }

    3)创建condition包,接下来再分别创建 Rice 和 Noodles 的条件类NoodlesCondition

    RiceCondition

    package com.java.condition;

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

    public class RiceCondition implements Condition {
        @Override
        public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
            return conditionContext.getEnvironment().getProperty("people").equals("南方人");
        }
    }

    package com.java.condition;

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

    public class NoodlesCondition implements Condition {
        @Override
        public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
            return conditionContext.getEnvironment().getProperty("people").equals("北方人");
        }
    }

    matches 方法中做条件属性判断,当系统属性中的 people 属性值为 '北方人' 的时候,NoodlesCondition 的条件得到满足,当系统中 people 属性值为 '南方人' 的时候,RiceCondition 的条件得到满足,换句话说,哪个条件得到满足,一会就会创建哪个 Bean 。

    3)创建config包,创建1个配置类JavaConfig

    package com.java.config;

    import com.java.Food;
    import com.java.condition.NoodlesCondition;
    import com.java.condition.RiceCondition;
    import com.java.impl.Noodles;
    import com.java.impl.Rice;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Conditional;
    import org.springframework.context.annotation.Configuration;

    @Configuration
    public class JavaConfig {
        @Bean("food")
        @Conditional(RiceCondition.class)
        Food rice(){
            return new Rice();
        }

        @Bean("food")
        @Conditional(NoodlesCondition.class)
        Food noodles(){
            return new Noodles();
        }
    }

    这个配置类,大家重点注意两个地方:

    两个 Bean 的名字都为 food,这不是巧合,而是有意取的。两个 Bean 的返回值都为其父类对象 Food。

    每个 Bean 上都多了 @Conditional 注解,当 @Conditional 注解中配置的条件类的 matches 方法返回值为 true 时,对应的 Bean 就会生效。

    l Configuration:是定义配置类的注解,该类类似Spring中的ApplicationContext.xml文件。

    l @Bean相当于配置文件中的<bean>节点中声明bean对象。

    4)编写测试类

    package com.java;

    import com.java.config.JavaConfig;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;

    public class Main {
        public static void main(String[] args) {
            AnnotationConfigApplicationContext ctx=new AnnotationConfigApplicationContext();
            ctx.getEnvironment().getSystemProperties().put("people","南方人");
            ctx.register(JavaConfig.class);
            ctx.refresh();
            Food food= (Food) ctx.getBean("food");
            System.out.println(food.showName());
        }
    }

    首先我们创建一个 AnnotationConfigApplicationContext 实例用来加载 Java 配置类,然后我们添加一个 property 到 environment 中,添加完成后,再去注册我们的配置类,然后刷新容器。容器刷新完成后,我们就可以从容器中去获取 food 的实例了,这个实例会根据 people 属性的不同,而创建出来不同的 Food 实例。这个就是 Spring 中的条件注解。

    大家可以动手写一下,无需半个小时。峰哥会按照一定的节奏,在公众号发布,同时大家也可以关注我在博客园中的专栏https://www.cnblogs.com/027kgc/.对于文章中的内容,峰哥会陆续开始免费的公开课。

  • 相关阅读:
    对 Spring IoC 的理解
    初识 Spring 框架
    CSS 全局样式
    Bootstrap 12 栅格系统
    551 闭包,浏览器垃圾回收机制/内存收机制
    550 JavaScript运行机制之“堆栈”
    549 数据类型转换汇总:转换为Number、字符串、布尔,比 较操作==、===,练习题
    547 Promise:Ajax 的串行、并行, Promise的executor和状态,then、catch、finally,then链
    546 变量提升
    545 parseInt解析
  • 原文地址:https://www.cnblogs.com/027kgc/p/12393798.html
Copyright © 2011-2022 走看看