全栈之路-杂篇-探究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注解的,我们采用的是@[email protected]注解结合的方式进行注入操作

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

原文地址:https://www.cnblogs.com/ssh-html/p/12297240.html

时间: 2024-10-03 23:34:31

全栈之路-杂篇-探究springBoot中的条件注解的相关文章

绝版Node--Sequlize搭建服务(Node全栈之路 二)

在Node全栈之路(一),也就是上篇文章中,我们讲到了sequlize的基本增删该查,这篇文章,我们在上篇文章的基础上继续探讨,讲一下关于sequlize创建的表之间的对应关系 参考资料:https://itbilu.com/nodejs/npm/VkYIaRPz-.html#induction-promise 本人联系方式:微信:jkxx123321

6Python全栈之路系列之MySQL存储过程

Python全栈之路系列之MySQL存储过程 存储过程是一个SQL语句集合,当主动去调用存储过程时,其中内部的SQL语句会按照逻辑执行. 存储过程过接收的参数 参数 描述 in 仅用于传入参数用 out 仅用于返回值用 inout 既可以传入又可以当作返回值 创建存储过程 创建一个简单的存储过程 -- 修改SQL语句的结束符为% delimiter % -- 创建这个存储过程先删除 DROP PROCEDURE IF EXISTS proc_p1 % CREATE PROCEDURE proc_

3Python全栈之路系列之MySQL表内操作

Python全栈之路系列之My SQL表内操作 先创创建一个表用于测试 -- 创建数据库 CREATE DATABASE dbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci; -- 创建表 CREATE TABLE `tb` (   `id` int(5) NOT NULL AUTO_INCREMENT,   `name` char(15) NOT NULL,   `alias` varchar(10) DEFAULT NULL,   `ema

8Python全栈之路系列之MySQL触发器

Python全栈之路系列之MySQL触发器 l 对某个表进行增/删/改操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行增/删/改前后的行为. 创建触发器基本语法 插入前 CREATE TRIGGER tri_before_insert_tb1 BEFORE INSERT ON tb1 FOR EACH ROW BEGIN     ... END 插入后 CREATE TRIGGER tri_after_insert_tb1 AFTER INSERT ON t

1Python全栈之路系列之Django初体验

Python全栈之路系列之Django初体验 Django不得不说在Python中是一个非常强大的全栈框架,而且入门也比较简单,只要你学完了基本的Django知识,接着再做一两个项目,不大不小就成,然后你再去学其它的框架你会发现,在那些小而美的框架中,你学起来将非常的快,因为你在学习Django的时候就已经学习并且体验过了Web开发流程,所以会有这么一个现象出现,有些新手朋友在学习Flask.Tornado等小而美的框架时,很多概念不是很理解,比如ORM.路由等,但你学Django就不会出现这种

3Python全栈之路系列之D

Python全栈之路系列之Django模板 模板是一个文本,用于分离文档的表现形式和内容,模板定义了占位符以及各种用于规范文档该如何显示的各部分基本逻辑(模板标签).模板通常用于产生HTML,但是Django的模板也能产生任何基于文本格式的文档. 如何使用模板系统 在Python代码中使用Django模板的最基本方式如下: 可以用原始的模板代码字符串创建一个Template对象,Django同样支持用指定模板文件路径的方式来创建Template对象; 调用模板对象的render方法,并且传入一套

6Python全栈之路系列之迭代器与生成器

生成器 仅仅拥有生成某种东西的能力,如果不用__next__方法是获取不到值得. 创建一个生成器函数 >>> def scq(): ...    print("11")        # 当函数代码块中遇到yield关键字的时候,这个函数就是一个生成器函数 ...    yield 1 ...    print("22") ...    yield 2 ...    print("33") ...    yield 3 ...

2Python全栈之路系列之MysQl基本数据类型

Python全栈之路系列之MySQL基本数据类型 MySQL中定义数据字段的类型对你数据库的优化是非常重要的. MySQL支持多种类型,大致可以分为三类: 数字类型 日期和时间类型 字符串类型 数字类型 类型 大小 用途 BIT - 二进制 TINYINT 1字节 小整数值 INT or INTEGER 4字节 大整数值 BIGINT 8字节 极大整数值 DECIMAL 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 小数值 FLOAT 4字节 单精度浮点数值 DOUBLE 8字

4Python全栈之路系列之MYSQL外键

Python全栈之路系列之MySQL外键 先来个例子来说明什么是外键以及外键的作用,so,XO公司现正处于一种迅速发展的状态,从最初的12人的团队发展到现在的300人,那么问题就来了,发展的越快,人员与部门就越来越多,这是老大要求我们做一个人员管理系统,用于查询入职人员的信息等. 起初我们想用一个表来实现所有的人员统计,创建Personnel库,用于存放公司员工的信息,指令如下: CREATE DATABASE personnel DEFAULT CHARSET utf8 COLLATE utf