这个是接上一个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后端到全栈》视频课程