当前位置: 首页 > news >正文

Spring整合第三方框架

目录

Spring整合第三方框架

加载外部properties文件

自定义命名空间解析原理

自定义命名空间总结和案例需求

总结

案例


Spring整合第三方框架

加载外部properties文件

  • Spring整合第三方框架不像MyBatis那么简单了,例如Dubbo框架在与Spring框架整合时,要使用Dubbo提供的命名空间拓展方式,自定义一些Dubbo的标签,为了降低学习成本,不再引用第三方框架了,以Spring的context命名空间进行讲解,该方式也是命名空间拓展方式。文章传送门:基于Xml方式Bean的配置-命名空间种类_保持敬畏的博客-CSDN博客
  • 需求:加载外部peoperties文件,将键值对存储到Spring容器中
    • 首先将需要配置的信息存入到创建的properties配置文件中
    • jdbc.driver=com.mysql.jdbc.Driver
      jdbc.url=jdbc:mysql://localhost:3306/db02
      jdbc.username=root
      jdbc.password=123456
    • 然后在配置文件中加载创建的配置文件,同时使用其中的配置信息

    • <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><!--  todo  加载properties配置文件--><context:property-placeholder location="classpath:jdbc.properties"/><!-- todo 配置数据源信息 --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></bean><bean class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/></bean><!-- 扫描指定的包,产生mapper对象存储到Spring容器中,不需要再配置Mapper对象--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.example.Mapper"/></bean><bean id="userService" class="com.example.Service.Impl.UserServiceImpl"><property name="empMapper" ref="empMapper"></property><property name="userDAO" ref="userDAO"/><property name="name" value="hhhh"/></bean><bean name="userDAO" class="com.example.DAO.Impl.UserDAOImpl"/>
      </beans>
      

自定义命名空间解析原理

  • 自定义的命名空间中可能会配置很多标签,不同的标签对应不同的解析器,由此我们在创建第三方框架时,要创建META-INF/spring.handlers文件,在该文件中将不同的标签与不同的解析器(Namespacehandler)对应起来,解析器一般都实现对应的接口(NamespaceHandler),在解析器中会重写init()方法(--xxx初始化方法,针对于命名空间中不同的标签,注册属于当前标签的解析器类,该类也实现BeanDefinitionParsee接口,其中也有parse()方法,在Spring解析到对应的标签时就会调用该parse()方法,该方法逻辑自己根据业务需求进行定义,主要就是将某个BeanDefinition对象进行注册,最终存入单例池中,或者向Spring容器中注册一个BeanPostProcessor,对于Spring中配置的bean进行操作xxx--)以及parse()方法(解析方法)parse()方法则主要用于解析具体的标签,将其转换为对应的BeanDefinition对象,并注册到Spring容器中。我们在配置文件中使用自定义命名空间的标签时,会出现约束
    这些约束源于我们在配置文件中设置的约束地址
    同样的在MATE-INF/spring.schemas文件中进行设置约束地址与文件位置进行映射

自定义命名空间总结和案例需求

总结
  • 通过上述分析,外部命名空间标签的执行流程如下:
    • 将自定义表标签的约束与物理约束文件与网络约束名称的约束以键值对的形式存储到一个spring.schemas文件中,将文件存储在类加载路径的MATE-INF中,Spring框架会自动加载到
    • 将自定义命名空间的名称与自定义命名空间处理器映射关系,以键值对的形式存储到spring.handlers文件中,该文件存储在类加载路径的MATE-INF中,Spring会自动加载到
    • 准备好NaspaceHandler,如果命名空间只有一个标签,那么直接在parse()方法中进行解析即可,一般解析结果就是注册对应的BeanDefinition,如果命名空间中有多个标签,那么可以在init方法中为每个标签都注册一个BeanDefinitionParser,在执行NamespaceHandler的parser方法时再分流给不同的BeanDefinitionParser解析解析(重写doParse方法即可)
  • ps:讲的有些抽象,具体是跟着课程翻源码看来三四遍才多多少少理解了一些,大家还需要自己去找对应的教程,或者有补充修改意见的欢迎在评论区留言。
案例
  • 设想自己是一名架构师,进行某一个框架和Spring的集成开发,效果是通过一个指令标签,向Spring容器中自动注入一个BeanPostProcessor
  • 步骤分析
  • 确定命名空间名称、schema虚拟路径、标签名称
  • 编写schema约束文件haohao-annotation.xsd
    • 具体代码如下
    • <?xml version="1.0" encoding="UTF-8"?><xsd:schema xmlns="http://www.example.com/haohao"xmlns:xsd="http://www.w3.org/2001/XMLSchema"targetNamespace="http://www.example.com/haohao"><xsd:element name="annotation-driven"></xsd:element></xsd:schema>
  • 在类加载路径下创建META目录,编写约束映射文件spring.schema和处理器映射文件spring.handlers
    • spring.schema
      • http\://www.example.com/haohao/haohao-annotation.xsd=com/example/haohao/configure/haohao-annotation.xsd
    • spring.handlers

      • http\://www.example.com/haohao=com.example.handlers.HaoHaoNamespaceHandler
  • 编写命名空间处理器HaohaoNamespaceHandler,在init()方法中注册HaohaoBeanDefintionparser
    • package com.example.handlers;import org.springframework.beans.factory.xml.NamespaceHandlerSupport;public class HaoHaoNamespaceHandler extends NamespaceHandlerSupport {@Overridepublic void init() {// 初始化,一般情况下,一个命名空间下有多个标签,会在当前init方法中为每一个标签注册一个标签解析器this.registerBeanDefinitionParser("annotation-driven", new HaoHaoBeanDefinitionParser());}
      }
      
  • 编写标签的解析器HaohaoBeanDefinitionPaeser,在parser方法中注册HaohaoBeanPostProcessor
    • package com.example.handlers;import org.springframework.beans.factory.config.BeanDefinition;
      import org.springframework.beans.factory.support.RootBeanDefinition;
      import org.springframework.beans.factory.xml.ParserContext;
      import org.w3c.dom.Element;public class HaoHaoBeanDefinitionParser implements org.springframework.beans.factory.xml.BeanDefinitionParser {@Overridepublic BeanDefinition parse(Element element, ParserContext parserContext) {// 注入一个BeanPostProcessorBeanDefinition beanDefinition = new RootBeanDefinition();beanDefinition.setBeanClassName("com.example.PostProcessor.HaoHaoBeanPostProcessor");parserContext.getRegistry().registerBeanDefinition("HaoHaoBeanPostProcessor", beanDefinition);return beanDefinition;}
      }
      
  • 编写HaohaoBeanPostProcessor
    • package com.example.PostProcessor;import org.springframework.beans.BeansException;
      import org.springframework.beans.factory.config.BeanPostProcessor;public class HaoHaoBeanPostProcessor implements BeanPostProcessor {@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {System.out.println("HaoHaoBeanPostProcessor执行......");return bean;}
      }
      
  • ========上述步骤由框架开发者完成,下列步骤由框架使用者完成=======
  • 在applicationContext.xml配置文件中引入命名空间
  • 在applicationContext.xml配置文件中使用自定义标签

相关文章:

Spring整合第三方框架

目录 Spring整合第三方框架 加载外部properties文件 自定义命名空间解析原理 自定义命名空间总结和案例需求 总结 案例 Spring整合第三方框架 加载外部properties文件 Spring整合第三方框架不像MyBatis那么简单了&#xff0c;例如Dubbo框架在与Spring框架整合时&#xf…...

Linux Shell 无vi获取文件某行指定内容和修改某行指定内容

注意&#xff1a;操作之前一定要先备份&#xff01;&#xff01;&#xff01;一定要先备份&#xff01;&#xff01;&#xff01;一定要先备份&#xff01;&#xff01;&#xff01; 1. 获取某配置文件中某一行某项的值 cat /sshd_config |grep "PermitRootLogin" …...

在EXCEL中构建加载项之创建加载项的目的及规范要求

【分享成果&#xff0c;随喜正能量】一句南无阿弥陀佛&#xff0c;本是释迦牟尼佛所证的无上正等正觉法&#xff0c;洒在娑婆世界的众生海中&#xff0c;只为末世众生能够以信愿之心抓住此救命稻草&#xff0c;要知道今世人此生的处境&#xff0c;可能只剩这道要么极乐要么三涂…...

Hive【Hive(三)查询语句】

前言 今天是中秋节&#xff0c;早上七点就醒了&#xff0c;干啥呢&#xff0c;大一开学后空教室紧缺&#xff0c;还不趁着假期来学校等啥呢。顺便偷偷许个愿吧&#xff0c;希望在明年的这个时候&#xff0c;秋招不知道赶不赶得上&#xff0c;我希望拿几个国奖&#xff0c;蓝桥杯…...

商场做小程序商城的作用是什么?

商场是众多商家聚集在一起的购物公共场所&#xff0c;大商场也往往入驻着众多行业商家&#xff0c;是每个城市重要的组成部分。 随着互联网电商深入及客户消费行为改变&#xff0c;不少商场如今的客流量非常有限&#xff0c;甚至可以说是员工比客人多&#xff0c;这就导致撤店…...

XPD738协议系列-USB Type-C PD 和 Type-A 双口控制器

产品描述&#xff1a; XPD738 是一款集成 USB Type-C、USB Power Delivery&#xff08;PD&#xff09;2.0/3.0 以及 PPS、QC3.0/QC3.0/QC2.0 快充协议、华为 FCP/SCP/HVSCP 快充协议、三星 AFC 快充协议、BC1.2 DCP 以及苹果设备 2.4A 充电规范的多功能 USB Type-C 和 Type-A …...

【面试八股】IP协议八股

IP协议八股 子网掩码的作用为什么IP协议需要分片IP协议什么时候需要分片IP协议是怎么进行分片的那么IP协议是如果进行标识属于同一个分片呢&#xff1f;TCP协议和UDP协议将数据交给IP协议之后&#xff0c;是否需要分片传输&#xff1f; 子网掩码的作用 用来标识网络号和主机号…...

【冰糖R语言】创建R包(打包R程序)

目标&#xff1a;将现有R程序打包 可能涉及知识点&#xff1a;devtools包、usethis包、Rstudio软件 一、R包的类型 通常一个R包中包含以下元素&#xff1a; 1&#xff09;R文件夹&#xff1a;函数代码 2&#xff09;man文件夹&#xff1a;存放每个函数的注释文件 3&#x…...

照片后期处理软件DxO FilmPack 6 mac中文说明

DxO FilmPack 6 for Mac是一款照片后期处理软件。它可以模拟超过60种著名胶片品牌和类型的色彩和颗粒感&#xff0c;使照片具有复古、艺术和时尚风格。 ​DxO FilmPack 6 mac支持RAW和JPG格式的照片&#xff0c;并提供丰富的调整选项&#xff0c;如亮度、对比度、曝光、阴影和高…...

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真+程序+原理图+报告+讲解视频)

51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显示( proteus仿真程序原理图报告讲解视频&#xff09; 讲解视频1.主要功能&#xff1a;2.仿真3. 程序代码4.原理图5. 设计报告6. 设计资料内容清单 51单片机音乐闹钟秒表倒计时整点报时多功能电子钟万年历数码管显…...

Scala第九章节

Scala第九章节 scala总目录 章节目标 理解包的相关内容掌握样例类, 样例对象的使用掌握计算器案例 1. 包 实际开发中, 我们肯定会遇到同名的类, 例如: 两个Person类. 那在不改变类名的情况下, 如何区分它们呢? 这就要使用到包(package)了. 1.1 简介 包就是文件夹, 用关…...

arduino - UNO-R3,mega2560-R3,NUCLEO-H723ZG的arduino引脚定义区别

文章目录 arduino - UNO-R3,mega2560-R3,NUCLEO-H723ZG的引脚定义区别概述笔记NUCLEO-H723ZGmega2560-R3UNO-R3经过比对, 这2个板子(NUCLEO-H723ZG, mega2560-R3)都是和UNO-R3的arduino引脚定义一样的.mega2560-r3和NUCLEO-H723ZG的区别补充arduino uno r3的纯数字IO和模拟IO作…...

提取多个txt数据并合成excel——例子:与中国建交的国家

提取多个txt数据并合成excel——例子&#xff1a;与中国建交的国家 一、概要二、整体架构流程三、完整代码 一、概要 这段代码主要执行以下任务&#xff1a; 1. 定义辅助函数&#xff1a;首先&#xff0c;定义了两个辅助函数。has_chinese_chars函数用于检查给定的字符串中是否…...

uni-app:js修改元素样式(宽度、外边距)

效果 代码 1、在<view>元素上添加一个ref属性&#xff0c;用于在JavaScript代码中获取对该元素的引用&#xff1a;<view ref"myView" id"mybox"></view> 2、获取元素引用 &#xff1a;const viewElement this.$refs.myView.$el; 3、修改…...

day36-单元测试

1. 单元测试Junit 1.1 什么是单元测试&#xff1f;&#xff08;掌握&#xff09; 对部分代码进行测试。 1.2 Junit的特点&#xff1f;&#xff08;掌握&#xff09; 是一个第三方的工具。&#xff08;把别人写的代码导入项目中&#xff09;&#xff08;专业叫法&#xff1a;…...

7、脏话检测

6、片花关联长视频 脏话检测功能本身远不如上一篇介绍的片花关联长视频有技术挑战性&#xff0c;不过还是值得说说&#xff0c;因为这是我们采用技术方式提高工作效率的第一次尝试。 游戏解说是审核难度比较大的一类短视频内容&#xff0c;一方面是时间比较长&#xff0c;很多…...

Godot信号教程(使用C#语言)| 创建自定义信号 | 发出自定义信号 | 使用代码监听信号

文章目录 信号是什么连接信号使用编辑器连接信号使用代码连接信号Lambda 自定义信号声明信号发射信号带参数的信号 其他文章 信号是什么 在Godot游戏引擎中&#xff0c;信号是一种用于对象之间通信的重要机制。它允许一个对象发出信号&#xff0c;而其他对象可以连接到这个信号…...

分布式文件存储系统minio、大文件分片传输

上传大文件 1、Promise对象 Promise 对象代表一个异步操作&#xff0c;有三种状态&#xff1a; pending: 初始状态&#xff0c;不是成功或失败状态。fulfilled: 意味着操作成功完成。rejected: 意味着操作失败。 只有异步操作的结果&#xff0c;可以决定当前是哪一种状态&a…...

在 msys2/mingw 下安装及编译 opencv

最简单就是直接安装 pacman -S mingw-w64-x86_64-opencv 以下记录一下编译的过程 1. 安装编译工具及第三方库 pacman -S --needed base-devel mingw-w64-x86_64-toolchain unzip gccpacman -S python mingw-w64-x86_64-python2 mingw-w64-x86_64-gtk3 mingw-w64-x86_64-…...

java 根据身份证号码判断性别

在Java中&#xff0c;您可以根据身份证号码的规则来判断性别。中国的身份证号码通常采用的是以下规则&#xff1a; 第17位数字代表性别&#xff0c;奇数表示男性&#xff0c;偶数表示女性。 通常&#xff0c;男性的出生日期的第15、16位数字是01&#xff0c;女性是02。 请注意&…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...