全栈之路-杂篇-探究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

posted @ 2020-02-12 17:02  ssc在路上  阅读(219)  评论(0编辑  收藏  举报