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.rhkb.cn/news/95295.html

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

相关文章

ICT产教融合创新实训基地软件测试实训室建设方案

一 、系统概述 ICT产教融合创新&#xff0c;简单来说&#xff0c;就是信息与通信技术&#xff08;ICT&#xff09;与产业界、教育界的融合创新。这个概念强调了在现代社会中&#xff0c;信息技术与产业发展以及教育培训之间相互关联的重要性。 ICT产教融合创新的核心思想包括以…

lambda表达式

一&#xff0c;什么是lambda表达式 1.1 函数式接口 要想了解什么是lambda表达式&#xff0c;就必须得知道什么是函数式接口&#xff0c;函数式接口是指只包含一个抽象方法的接口。如果我们自己写一个函数时接口&#xff0c;最好在接口前添加Functionallnterface&#xff0c;和…

程序员如何利用公网远程访问查询本地硬盘【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《高效编程技巧》《cpolar》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 公网远程访问本地硬盘文件【内网穿透】 文章目录 公网远程访问本地硬盘文件【内网穿透】前言1. 下载cpolar和Everything软件1.…

去掉鼠标系列之一: 语雀快捷键使用指南

其实应该是系列之二了&#xff0c;因为前面写了一个关于Interlij IDEA的快捷键了。 为什么要写这个了&#xff0c;主要是觉得一会儿用鼠标&#xff0c;一会儿键盘&#xff0c;一点儿不酷&#xff0c;我希望可以一直用键盘&#xff0c;抛开鼠标。后面陆续记录一下各个软件的快捷…

Lnton羚通算法算力云平台在环境配置时 OpenCV 无法显示图像是什么原因?

问题&#xff1a; cv2.imshow 显示图像时报错&#xff0c;无法显示图像 0%| | 0/1 [00:00<…

【数据结构】栈和队列

大家好&#xff01;今天我们来学习数据结构中的栈和队列。 目录 1. 栈 1.1 栈的概念及结构 1.2 栈的定义 1.3 栈的接口实现 1.3.1 初始化栈 1.3.2 入栈 1.3.3 出栈 1.3.4 获取栈顶元素 1.3.5 获取栈中有效元素个数 1.3.6 检测栈是否为空 1.3.7 销毁栈 1.4 栈的完整…

堆 和 优先级队列(超详细讲解,就怕你学不会)

优先级队列 一、堆的概念特性二、堆的创建1、向下调整算法2、向下调整建堆3、向下调整建堆的时间复杂度 三、堆的插入1、向上调整算法实现插入2、插入创建堆的时间复杂度 三、堆的删除四、Java集合中的优先级队列1、PriorityQueue 接口概述及模拟实现2、如何创建大根堆&#xf…

【Java 动态数据统计图】动态数据统计思路案例(动态,排序,containsKey)五(117)

需求&#xff1a;前端根据后端的返回数据&#xff1a;画统计图&#xff1b; 1.动态获取地域数据以及数据中的平均值&#xff0c;按照平均值降序排序&#xff1b; 说明&#xff1a; X轴是动态的&#xff0c;有对应区域数据则展示&#xff1b; X轴 区域数据降序排序&#xff1b;…

Intelij IDEA 配置Tomcat解决Application Server不显示的问题

今天搭建war工程时部署项目发现&#xff0c;IDEA的控制台没有Application Servers&#xff0c;在网上查了一下&#xff0c;总结几个比较好的解决方法&#xff0c;为了方便自己和其他人以后碰到相同的问题&#xff0c;不再浪费时间再次寻找解决办法。 Intelij IDEA 配置Tomcat时…

【Spring专题】Spring之Bean的生命周期源码解析——阶段二(二)(IOC之属性填充/依赖注入)

目录 前言阅读准备阅读指引阅读建议 课程内容一、依赖注入方式&#xff08;前置知识&#xff09;1.1 手动注入1.2 自动注入1.2.1 XML的autowire自动注入1.2.1.1 byType&#xff1a;按照类型进行注入1.2.1.2 byName&#xff1a;按照名称进行注入1.2.1.3 constructor&#xff1a;…

uniapp小程序实现上传图片功能,并显示上传进度

效果图&#xff1a; 实现方法&#xff1a; 一、通过uni.chooseMedia(OBJECT)方法&#xff0c;拍摄或从手机相册中选择图片或视频。 官方文档链接: https://uniapp.dcloud.net.cn/api/media/video.html#choosemedia uni.chooseMedia({count: 9,mediaType: [image,video],so…

【Django】无法从“django.utils.encoding”导入名称“force_text”

整晚处理 Django 的导入错误。 我将把它作为提醒&#xff0c;希望处于相同情况的人数会减少。 原因 某些软件包版本不支持Django 4 请看下表并决定Django和Python的版本 方案 如果出现难以响应&#xff0c;或者更改环境麻烦&#xff0c;请尝试以下操作 例如出现以下错误 …

【制作npm包2】了解 package.json 相关配置

制作npm包目录 本文是系列文章&#xff0c; 作者一个橙子pro&#xff0c;本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

(六)、深度学习框架中的算子

1、深度学习框架算子的基本概念 深度学习框架中的算子&#xff08;operator&#xff09;是指用于执行各种数学运算和操作的函数或类。这些算子通常被用来构建神经网络的各个层和组件&#xff0c;实现数据的传递、转换和计算。 算子是深度学习模型的基本组成单元&#xff0c;它们…

程序的DAC检查与LSM简介

程序的DAC检查 在Linux中&#xff0c;程序的DAC&#xff08;Discretionary Access Control&#xff0c;自主访问控制&#xff09;检查是指操作系统对程序执行期间对文件和资源的访问权限进行的检查。 Linux使用一种基于权限的访问控制模型&#xff0c;其中每个文件和资源都与…

Spark 图计算ONEID 进阶版

0、环境信息 本文采用阿里云maxcompute的spark环境为基础进行的&#xff0c;搭建本地spark环境参考搭建Windows开发环境_云原生大数据计算服务 MaxCompute-阿里云帮助中心 版本spark 2.4.5&#xff0c;maven版本大于3.8.4 ①配置pom依赖 详见2-1 ②添加运行jar包 ③添加配置信…

【Linux】IO多路转接——poll接口

目录 poll初识 poll函数 poll服务器 poll的优点 poll的缺点 poll初识 poll也是系统提供的一个多路转接接口。 poll系统调用也可以让我们的程序同时监视多个文件描述符上的事件是否就绪&#xff0c;和select的定位是一样的&#xff0c;适用场景也是一样的。 poll函数 po…

LC-将有序数组转换为二叉搜索树

LC-将有序数组转换为二叉搜索树 链接&#xff1a;https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/ 描述&#xff1a; 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索…

QT的mysql(数据库)最佳实践和常见问题解答

涉及到数据库&#xff0c;首先安利一个软件Navicat Premium&#xff0c;用来查询数据库很方便 QMysql驱动是Qt SQL模块使用的插件&#xff0c;用于与MySQL数据库进行通信。要编译QMysql驱动&#xff0c;您需要满足以下条件&#xff1a; 您需要安装MySQL的客户端库和开发头文件…

【LeetCode】字符串匹配

字符串匹配问题 常见的字符串匹配算法包括暴力匹配、 Knuth-Morris-Pratt 算法、Boyer-Moore算法、Sunday 算法等 解题 思路 1: 两个指针各指向两个字符串的起始位置,先判断,两个字符串的第一个字符是否相同,如果相同的话,则将两个指针往下移动,并且判断较短字符串的下一个字符…