26、springboot的自动配置03--核心功能--自定义条件注解及使用

开发自己的自动配置------开发自己的条件注解

★ 自定义条件注解

好处有两个:
1. 真正掌握Spring boot条件注解的本质。
2. 项目遇到一些特殊的需求时,也可以开发自己的自定义条件注解来解决问题。自定义条件注解:
▲ 所有自定义注解其实都是基于@Conditional的 ,@Conditional的可以说一切条件注解的老祖宗。
▲ 使用@Conditional定义新条件注解关键就是要有个Condition实现类,该Condition实现类就负责条件注解的处理逻辑:它所实现的matches()方法决定了该条件注解的要求是否得到满足。 (1)实现Condition实现类, 该实现必须实现matches方法。该方法就是条件注解的判断逻辑换而言之,条件注解是否通过检查,就是看该方法的返回值是否为true(2)定义条件注解——它是一个注解。在该注解上使用@Conditional来指定该条件注解实际其作用的Condition实现类。、

步骤理解:定义一个注解,写一些属性,比如成员变量,然后再创建一个类,用来写这个自定义注解的逻辑,就这两步而已。

代码演示:

步骤:
1、自定义一个条件注解。
在这里插入图片描述
2、定义一个处理类,用来处理自定义条件注解的处理逻辑。这个类需要实现 Condition 接口,并重写这个接口的 matches 方法,这个matches 方法就是要写自定义条件注解的处理逻辑。

自己整理的思路解释:
在这里插入图片描述

写代码时的思路解释,截图:
在这里插入图片描述
在这里插入图片描述

3、进行测试,因为自定义条件注解里面的value属性,在yml配置文件都有对应上,所以这个自定义条件注解检查通过,使用这个注解能通过、生效。
在这里插入图片描述

思路分析:
1、自定义一个条件注解,其实也是一个普通注解,之所以是条件注解,主要是看这个注解的处理类是怎么处理的。
2、自定义一个条件注解的处理类,实现Condition 接口,并且重写 matches 方法,在matches方法中写自定义条件注解的处理检查逻辑
3、使用这个注解,在自定义的DateFormat这个bean上面添加这个自定义条件注解@ConditionalCustom,只有这个注解的条件都检查通过了,这个 DatFormat 这个bean 才能生效。

自定义条件注解的值的传递及条件判断的顺序如图:
在这里插入图片描述

处理自定义注解逻辑的类的解释
在这里插入图片描述
在这里插入图片描述

package cn.ljh.app.condition;import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;import java.util.Map;//这是一个自定义条件注解的处理类//条件注解就是这个注解指定了一些条件,只有项目中的代码符合这些条件,被该注解修饰的类或方法才能生效。//这个类是用来处理自定义条件注解的处理逻辑的。
public class MyCondition implements Condition {//这个方法就是我们自定义条件注解的判断逻辑//就是自定义的条件注解是否通过检查,就是看这个方法的返回值是否为true。//通过检查可以理解这个条件注解的条件在项目中是存在的,比如某个配置文件存在某个条件注解指定的属性值,就能通过检查//ConditionContext 获取当前项目的配置环境(比如配置文件信息)//AnnotatedTypeMetadata  用来获取指定注解的全部属性@Overridepublic boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {//AnnotatedTypeMetadata 相当于是一个反射工具类,用来获取注解的信息//可用于获取指定注解(ConditionalCustom)的全部属性(value),方法返回值是一个map结构Map<String, Object> attrs = annotatedTypeMetadata.getAnnotationAttributes(ConditionalCustom.class.getName());//因为我们自定义的条件注解ConditionalCustom只定义了一个value属性,所以我们要在返回的map结构中获取它的属性值//获取自定义注解的value属性,这些值是字符串数组。String[] value = (String[]) attrs.get("value");//然后就是根据这些属性值来做一些逻辑判断,就是只有这些逻辑判断都成立,这个自定义条件注解才能通过检查、生效。//此处我们的逻辑,要求项目必须是value所指定的每个配置属性都存在//为了检查每个配置属性都存在,因此要先获取springboot的配置环境(配置文件)Environment env = conditionContext.getEnvironment();//遍历value属性值的每个元素-----要求每个元素指定的配置属性都是存在的,该条件注解才能通过检查、生效。for (String propName : value){//判断配置环境是否有注解中对应这些属性if(env.getProperty(propName) == null){//如果通过 propName 获取对应的配置属性有一个不存在,那么这个自定义条件注解的检查就没有通过,返回falsereturn false;}}//如果for循环的每个元素对应的配置属性都存在,那就说明这个自定义注解通过检查,因此返回true。return true;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app的Vue.js实现微信小程序的紧急事件登记页面功能

主要功能实现 完成发生时间选择功能&#xff0c;用户可以通过日期选择器选择事件发生的时间。实现事件类型选择功能&#xff0c;用户可以通过下拉选择框选择事件的类型。添加子养殖场编号输入框&#xff0c;用户可以输入与事件相关的子养殖场编号。完成事件描述输入功能&#…

【MySQL系列】--初识数据库

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

[管理与领导-29]:IT基层管理者 - 团队管理 - 马斯洛需求层次在家庭、情侣、朋友、人生、职场中应用

目录 前言&#xff1a; 一、马斯洛需求层次理论 二、马斯洛需求层次理论在家庭中的应用 三、斯洛需求层次在夫妻、情侣之间的应用 四、马斯洛需求层次理论在朋友间的应用 五、马斯洛需求层次理论在人生发展的应用 六、马斯洛需求层次理论在职场中的应用 前言&#xff1a…

消息中间件相关面试题

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱发博客的嗯哼&#xff0c;爱好Java的小菜鸟 &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;社区论坛&#xff1a;希望大家能加入社区共同进步…

Eclipse集成MapStruct

Eclipse集成MapStruct 在Eclipse中添加MapStruct依赖配置Eclipse支持MapStruct①安装 m2e-aptEclipse Marketplace的方式安装Install new software的方式安装&#xff08;JDK8用到&#xff09; ②添加到pom.xml 今天拿到同事其他项目的源码&#xff0c;导入并运行的时候抛出了异…

【二叉树前沿篇】树

【二叉树前沿篇】树 1 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 1 树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是…

论文笔记:Continuous Trajectory Generation Based on Two-Stage GAN

2023 AAAI 1 intro 1.1 背景 建模人类个体移动模式并生成接近真实的轨迹在许多应用中至关重要 1&#xff09;生成轨迹方法能够为城市规划、流行病传播分析和交通管控等城市假设分析场景提供仿仿真数据支撑2&#xff09;生成轨迹方法也是目前促进轨迹数据开源共享与解决轨迹数…

Java进阶-Oracle(二十一)(2)

&#x1f33b;&#x1f33b; 目录 一、Oracle 数据库的操作(DDL DML DQL DCL TPL)1.1 标识符、关键字、函数等1.1.1 数值类型&#xff1a;1.1.2 字符串类型&#xff1a;1.1.3 日期类型1.1.4 大的数据类型--适合保存更多的数据 1.2 运算符1.3 函数---预定义函数、自定义函数&…

LeetCode128.最长连续序列

我这个方法有点投机取巧了&#xff0c;题目说时间复杂度最多O(n),而我调用了Arrays.sort(&#xff09;方法&#xff0c;他的时间复杂度是n*log(n)&#xff0c;但是AC了&#xff0c;这样的话这道题还是非常简单的&#xff0c;创建一个Hashmap&#xff0c;以nums数组的元素作为ke…

python中可以处理word文档的模块:docx模块

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说&#xff0c;直接开搞&#xff0c;如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 一.docx模块 Python可以利用python-docx模块处理word文档&#xff0c;处理方式是面向对象的。 也就是说python-docx模块…

归并排序:从二路到多路

前言 我们所熟知的快速排序和归并排序都是非常优秀的排序算法。 但是快速排序和归并排序的一个区别就是&#xff1a;快速排序是一种内部排序&#xff0c;而归并排序是一种外部排序。 简单理解归并排序&#xff1a;递归地拆分&#xff0c;回溯过程中&#xff0c;将排序结果进…

C++之std::pair<uint64_t, size_t>应用实例(一百七十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

PHP之Base64+php://filter绕过、disabled_function绕过

目录 一、Base64php://filter绕过 1.思路分析 2.实践验证 二、disabled_function绕过 一、Base64php://filter绕过 上课讲了这样一道题&#xff0c;一起来看下(以下代码适用于PHP7.x及以上&#xff0c;5的版本会报错) <?php function fun($var): bool{$blacklist …

野火i.mx 6ull上手

目录 屏幕驱动打印信息 实现触摸屏校验 开发板连接WIFI 连接操作 申请路由器动态IP和ping网络通断 WiFi信息保存位置 常用wifi操作&#xff08;wpa_cli工具&#xff09; NFS网络文件系统共享 虚拟机安装NFS服务器 开发板安装NFS客户端 控制开发板 找出硬件设备所对…

C语言实现贷款计算器

等额本金&#xff0c;等额本息数学推导:贷款 买房&#xff0c;利息怎么算&#xff1f;不要被忽悠了&#xff01;李永乐老师讲等额本金和等额本息 一个心血来潮的研究&#xff0c;避免以后买房被坑。 捣鼓了半天才发现原来支付宝的那个利率是年利率不是月利率&#xff0c;坑了…

驱动开发——字符设备

字符设备 Linux 将系统设备分为&#xff1a;字符设备、块设备、网络设备。工作原理 字符设备是 Linux 驱动中最基本的一类设备驱动&#xff0c;字符设备就是一个一个字节&#xff0c; 按照字节流进行读写操作的设备&#xff0c;读写数据是分先后顺序的。在Linux的世界里面一切…

如何修复损坏的DOC和DOCX格式Word文件?

我们日常办公中&#xff0c;经常用到Word文档。但是有时会遇到word文件损坏、无法打开的情况。这时该怎么办&#xff1f;接着往下看&#xff0c;小编在这里就给大家带来最简单的Word文件修复方法&#xff01; 很多时候DOC和DOCX Word文件会无缘无故的损坏无法打开&#xff0c;一…

【福建事业单位-综合基础知识】03行政法

【福建事业单位-综合基础知识】03行政法 1.行政法概述&#xff08;原则重点&#xff09;行政主体范围 行政行为总结 二.行政处罚2.1行政处罚的种类总结 行政法框架 1.行政法概述&#xff08;原则重点&#xff09; 行政法的首要原则是合法&#xff1b;自由裁量——合理行政&…

SSM——用户、角色、权限操作

1. 数据库与表结构 1.1 用户表 1.1.1 用户表信息描述 users 1.1.2 sql语句 CREATE TABLE users( id varchar2(32) default SYS_GUID() PRIMARY KEY, email VARCHAR2(50) UNIQUE NOT NULL, username VARCHAR2(50), PASSWORD VARCHAR2(50), phoneNum VARCHAR2(20), STATUS INT…

i18n 配置vue项目中英文语言包(中英文转化)

一、实现效果 二、下载插件创建文件夹 2.1 下载cookie来存储 npm install --save js-cookienpm i vue-i18n -S 2.2 封装组件多页面应用 2.3 创建配置语言包字段 三、示例代码 3.1 main.js 引用 i18n.js import i18n from ./lang// 实现语言切换:i18n处理element&#xff0c…