• 全栈之路-杂篇-探究SpringBoot中的条件注解


      这个是接上一个spring IOC注入机制中的进行继续探讨的,我们来继续探究OCP原则下的代码书写的问题,这个是利用条件注解.

    一、条件注解的基本用法

      这里还是之前的学习示例,简单的看一下

    1、实体类的代码

     这里有另个实体类,基本上就是一样的,只给出一个实体类的代码,另外,接口的代码也比较简单,不给出了,看的话,可以看上一篇那个中的代码

     1 public class Diana implements ISkill {
     2 
     3     private String skillName = "Diana R";
     4     private String name;
     5     private Integer age;
     6 
     7     public Diana(){
     8         System.out.println("Diana constructor...");
     9     }
    10 
    11     public Diana(String name, Integer age){
    12         this.name = name;
    13         this.age = age;
    14     }
    15 
    16     @Override
    17     public void q() {
    18         System.out.println("Diana Q");
    19     }
    20 
    21     @Override
    22     public void w() {
    23         System.out.println("Diana W");
    24     }
    25 
    26     @Override
    27     public void e() {
    28         System.out.println("Diana E");
    29     }
    30 
    31     @Override
    32     public void r() {
    33         System.out.println(this.skillName);
    34     }
    35 }

    注意:这个是没有@Component注解的,我们采用的是@Configuration+@Bean注解结合的方式进行注入操作

    2、condition类代码

      这个就是对注入条件进行控制的类,可以通过这个进行注入类的控制

    1 public class DianaCondition implements Condition {
    2 
    3     @Override
    4     public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
    5         String name = conditionContext.getEnvironment().getProperty("hero.condition");
    6         return "diana".equals(name);
    7     }
    8 }

    3、configuration类代码

     1 @Configuration
     2 public class HeroConfiguration {
     3 
     4     @Bean
     5     @Conditional(DianaCondition.class)
     6     public ISkill diana (){
     7         return new Diana("Diana", 18);
     8     }
     9 
    10     @Bean
    11     @Conditional(IreliaCondition.class)
    12     public ISkill irelia (){
    13         return new Irelia();
    14     }
    15 }

    注意:这里有两个实现类进行注入实例化操作的,本来这两个实现类的代码基本上相同,我只写了一个实现类的代码,注意那个@Conditional注解

    4、properties文件中配置

    1 hero.condition=diana

    二、成品条件组件

    1、@ConditionalOnProperty注解(最主要的)

    这个注解主要是有三个属性的,理解这三个属性如何来赋值,就能够很好的使用这个注解

     1 @Configuration
     2 public class HeroConfiguration {
     3 
     4     @Bean
     5     @ConditionalOnProperty(value = "hero.condition", havingValue = "diana", matchIfMissing = true)
     6     public ISkill diana (){
     7         return new Diana("Diana", 18);
     8     }
     9 
    10     @Bean
    11     @ConditionalOnProperty(value = "hero.condition", havingValue = "irelia")
    12     public ISkill irelia (){
    13         return new Irelia();
    14     }
    15 }

    这里需要结合properties文件进行使用的,看我们在properties文件中配置的是什么属性,我们在@ConditionalOnProperty注解的属性值中进行配置,主要注意一下matchIfMissing这个属性值,这个的含义是:

    ## 当在properties文件中没有找到hero.condition这个配置项的时候,会优先注入这个属性值设置为true的那个bean

    2、@ConditionalOnBean注解/@ConditionalOnMissingBean注解

    后面的这个注解相对前面的,会用的多一些,具体如何使用的?先看一个它的含义,就是在spring的IOC容器中没有指定的name的bean的时候才会注入当前需要注入的bean

     1 @Configuration
     2 public class HeroConfiguration {
     3 
     4     @Bean
     5     @ConditionalOnMissingBean(name = "mysql")
     6     public ISkill diana (){
     7         return new Diana("Diana", 18);
     8     }
     9 
    10 }

    当前代码中注解的意思就是说,只有在spring IOC容器中没有一个名字是mysql bean的时候才会向spring的容器中加入这个Diana的实例

    3、应用场景

      在平时的业务开发中,很少能够用到这些条件注解的,但是在第三方库的开发中,会用到,我暂时用不到,太菜了

     内容出处:七月老师《从Java后端到全栈》视频课程

    七月老师课程链接:https://class.imooc.com/sale/javafullstack

  • 相关阅读:
    .Net Core 微服务学习一
    微服务学习一
    软件开发基本接口学习二
    浏览器根对象window之操作方法
    浏览器根对象window之caches
    Angular面试题三
    浏览器根对象window之performance
    Angular面试题二
    浏览器根对象window之screen
    浏览器根对象window之history
  • 原文地址:https://www.cnblogs.com/ssh-html/p/12297240.html
Copyright © 2020-2023  润新知