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

news2024/9/28 9:11:31

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

★ 自定义条件注解

好处有两个:
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  用来获取指定注解的全部属性
    @Override
    public 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 获取对应的配置属性有一个不存在,那么这个自定义条件注解的检查就没有通过,返回false
                return false;
            }
        }
        //如果for循环的每个元素对应的配置属性都存在,那就说明这个自定义注解通过检查,因此返回true。
        return true;
    }
}

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

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

相关文章

香港服务器三网直连内地线路什么意思?好用吗?

​  三网直连内地是指香港服务器可以直接连接中国内地的电信、联通和移动三大运营商网络&#xff0c;避免了中间网络干线的支持。这样可以实现直接、快速、稳定的网络访问&#xff0c;提高用户对网络访问的效率&#xff0c;减少网络访问问题和拥堵的现象。 香港服务器直连内地…

开源项目AJ-Captcha使用小结

在网上看到开源项目AJ-Captcha&#xff0c;想把它加入到自己的项目中&#xff0c;遇到了一些问题&#xff0c;记录一下。 AJ-Captcha: 行为验证码(滑动拼图、点选文字)&#xff0c;前后端(java)交互&#xff0c;包含vue/h5/Android/IOS/flutter/uni-app/react/php/go/微信小程…

C# 读取pcd点云文件数据

pcd文件有ascii 和二进制格式&#xff0c;ascii可以直接记事本打开&#xff0c;C#可以一行行读。但二进制格式的打开是乱码&#xff0c;如果尝试程序中读取&#xff0c;对比下看了数据也对不上。 这里可以使用pcl里的函数来读取pcd&#xff0c;无论二进制或ascii都可以正确读取…

Fortinet数据中心防火墙及服务ROI超300%,Forrester TEI研究发布

近日&#xff0c;专注网络与安全融合的全球网络安全领导者 Fortinet&#xff08;NASDAQ&#xff1a;FTNT&#xff09;联合全球知名分析机构Forrester发布总体经济影响独立分析报告&#xff0c;详细阐述了在企业数据中心部署 FortiGate 下一代防火墙&#xff08;NGFW&#xff09…

web集群学习:搭建 LNMP应用环境

目录 LNMP的介绍&#xff1a; LNMP组合工作流程&#xff1a; FastCGI介绍&#xff1a; 1、什么是 CGI 2、什么是 FastCGI 配置LNMP 1、部署LNMP环境 2、配置LNMP环境 LNMP的介绍&#xff1a; 随着 Nginx Web 服务的逐渐流行&#xff0c;又岀现了新的 Web 服务环境组合—…

Ae 效果:CC WarpoMatic

过渡/CC WarpoMatic Transition/CC WarpoMatic CC WarpoMatic&#xff08;CC 自动扭曲&#xff09;主要用于创建动态的扭曲和弯曲过渡效果&#xff0c;可以在两个图层之间生成独特的过渡动画。 ‍ 这个效果允许用户根据特定的图层特性&#xff08;如亮度、对比度差异、亮度差异…

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)九:自定义组件封装下

一、本章内容 续上一张,本章实现一些自定义组件的封装,包括文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管

什么是大数据测试?有哪些类型?应该怎么测?

随着目前世界上各个国家使用大数据应用程序或应用大数据技术场景的数量呈指数增长&#xff0c;相应的&#xff0c;对于测试大数据应用时所需的知识与大数据测试工程师的需求也在同步增加。 针对大数据测试的相关技术已慢慢成为当下软件测试人员需要了解和掌握的一门通用技术。…

vue 安装并配置vuex

1.安装vuex命令:npm i vuex3.6.2 2.全局配置 在main文件里边导入-安装-挂载 main.js页面配置的 import Vue from vue import App from ./App.vue import Vuex from vuex//导入 Vue.use(Vuex)//安装插件 // 创建store对象 const store new Vuex.Store({ }) // 挂载到vue对象上…

ClickHouse AST is too big 报错问题处理记录

ClickHouse AST is too big 报错问题处理记录 问题描述问题分析解决方案1、修改系统配置2、修改业务逻辑 问题描述 项目中统计报表的查询出现 AST is too big 问题&#xff0c;报错信息如下&#xff1a; 问题分析 报错信息显示 AST is too big。 AST 表示查询语法树中的最大…

7-3 求给定精度的简单交错序列部分和

分数 15 全屏浏览题目 切换布局 作者 C课程组 单位 浙江大学 本题要求编写程序&#xff0c;计算序列部分和 1 - 1/4 1/7 - 1/10 ... 直到最后一项的绝对值不大于给定精度eps。 输入格式: 输入在一行中给出一个正实数eps。 输出格式: 在一行中按照“sum S”的格式输出…

2023年排行前五的大规模语言模型(LLM)

2023年排行前五的大规模语言模型(LLM) 截至2023年&#xff0c;人工智能正在风靡全球。它已经成为热门的讨论话题&#xff0c;吸引了数百万人的关注&#xff0c;不仅限于技术专家和研究人员&#xff0c;还包括来自不同背景的个人。人们对人工智能热情高涨的原因之一是其在人类多…

新版本Qt Creator无法提示错误、不报红

问题 更新新版本Qt Creator后无法实时提示错误&#xff0c;在开发中非常难受 如图&#xff0c;此时w后面少了;Qt Creator却只有红色横线标识&#xff0c;没有具体的错误。 解决方法 首先要知道&#xff0c;提供这个错误显示功能是ClangCodeModel插件提供的&#xff0c;因此…

Kafka-eagle监控平台

Kafka-Eagle简介 在开发工作中&#xff0c;当业务不复杂时&#xff0c;可以使用Kafka命令来进行一些集群的管理工作。但如果业务变得复杂&#xff0c;例如&#xff1a;需要增加group、topic分区&#xff0c;此时&#xff0c;再使用命令行就感觉很不方便&#xff0c;此时&#x…

FPGA_学习_15_IP核_VIO

前一篇博客我们提到在线调试的时候&#xff0c; 可执行文件只要烧进板子&#xff0c;程序它就会自己跑起来&#xff0c;不会等你点 这个按钮&#xff0c;它才开始跑。我们测试的模块中&#xff0c;里面可能有几个我们关心的信号&#xff0c;它会在程序刚运行很短的时间内发生状…

matlab初

matlab语言方式与c有很大的相似之处&#xff0c;此篇记录一下自己初步学习matlab的一些过程和代码 学习matlab主要是从b站上&#xff0c;也从matlab官网去学习了一下相关感兴趣的函数 版本是之前下好的R2022b 1.变量命名&#xff0c;这与c语言变量命名要求的规则非常相似 简单…

Pycharm与Anaconda Python的开发环境搭建

目录 一&#xff1a;下载 二&#xff1a;安装python 三&#xff1a;设置Pycharm 一&#xff1a;下载 下载Anaconda&#xff1a; Anaconda | The World’s Most Popular Data Science Platform 安装好以后&#xff0c;设置一下环境变量&#xff1a; 打开命令行&#xff0c…

双链表的插入,删除以及遍历

在上一节我们讲解了单链表的头插法和尾插法 http://t.csdn.cn/RixAu 但是单链表无法反向检索&#xff0c;对于某些情景可能造成不便&#xff0c;所以我们今天学习双链表 目录 1.双链表的初始化 2.双链表的插入 3.双链表的删除 4.遍历双链表 1.双链表的初始化 typedef i…

【Git】(一)基本操作

读完本文后&#xff0c;您会了解&#xff1a; 1、如何在本地配置GIT环境&#xff1f; 2、环境配置成功后&#xff0c;如何从远端下载一个已有仓库到本地? 1. 配置全局用户名、邮箱 git config --global user.name "username" git config --global user.email &q…

plt绘画带箭头的xy坐标轴

import matplotlib.pyplot as plt import mpl_toolkits.axisartist as axisartist# 创建画布 fig plt.figure() # 使用axisartist.Subplot方法创建一个绘图区对象ax ax axisartist.Subplot(fig,2,3,1) # 将绘图区对象添加到画布中 fig.add_axes(ax) # 通过set_axisline_style…