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

物联网项目-------配置模块以及XML,单例模式

学习XML
一.概念:XML(EXtensible Markup Language) ,可拓展标记语言
标记,指的的是标记语言,也称标签语言,可以用一系列的标签来对数据进行描述。
例如, tom
拓展,指的是用户可以自定义标签
二.作用

XML和HTML对比
1.XML主要是用来描述数据的
2.HTML主要是用来展现数据的

三.文档声明

四.元素
元素,指的是XML中的标记,这种标记也被称为标签,节点
1.XML必须包含根元素

2.元素是可以包含标签体的,也就是在标签之间可以写一些内容

3.元素也可以不包含标签体

4.XML标签对大小写敏感

5.XML标签允许嵌套但是不允许交叉

五.属性
xml属性写在开始标签中,属性值必须加引号

一个元素可以有多个属性,属性与属性之间用空格分开

XML中的实体的格式:&实体名;

这些预先定义的实体还支持自定义实体
格式:

根元素:root 实体名:name 实体内容:张三

CDATA

现在我们就想要浏览器输出&怎么做?

格式:

XML解析的方式一般分为两种:

1.DOM解析
缺点:如果XMl文档过大,需要把整个XML文档装载进内存,这时候就对内存空间要求比较高

XML文件解析(使用DOM解析)
在测试类中的resource中,新建一个student.xml文件,文件内容的根元素是bookstore,book元素,包含的属性是category,title元素,包含的属性是语言,包含的内容是书名,year元素,包含的内容是2005,price元素,包含的内容是30.00

JAXP中的DOM解析步骤:


1.创建测试类DomTest
2.定义一个dom方法
3.获取工厂对象 DocumentBuilderFactory.newInstance()
4.通过工厂对象调用文档构建对象
Factory.newDocumentBuilder()
5.获取文档对象
builder.parse(“”)
6.用文档对象调用获取文档元素的方法
7.用根元素调用二级子节点输出二级子节点包含的长度也就是节点和属性的个数

我们可以通过root根节点拿到二级节点包含的一切,通过二级节点拿到三级节点一切

xml文件


由于根节点bookstore没有属性,也没有内容,我们获取它是为了后期用它调用二级节点的属性,文本内容,再用二级节点调用三级节点的属性和内容



基于java的xml的API写的时候比较麻烦用上面的方法,现引入DOM4j技术

DOM4J
是一个java的XML API,用来读写XML文件的
1.引入
maven项目,在pom.xml文件中引入依赖

在测试类中写一个迭代器类进行测试
1.定义一个方法
2.提供一个List集合,Integer类型
3.添加元素
4.原来的for循环改成用Iterator对象
5.while循环,遍历下一个对象
6.输出

继续在测试类中创建一个Dom4j测试类,获取xml文档中的元素
1.创建类
2.@Test
3.定义方法
4.创建SAXReader对象
5.调用read方法,传入xml文件路径,获取document对象
6.通过document对象拿到根节点
7.通过根节点调用getName获得根节点名称
8.输出


继续遍历二级节点,三级节点
1.root调用elementIterator传入空参,就可以自己指定输出什么内容(例:指定二级节点元素,属性等),传入String s代表全部参数都会传入
2.遍历
3.获取二级属性节点,属性值

4.二级根结点element调用elementIterator获取三级节点
5.遍历,获取三级元素结点名称
6.调用属性遍历方法进行遍历所有输出三级节点属性名和属性值
7.调用获取文本方法获取三级节点的文本

输出部分结果

IOC(Inversion of Control)控制反转
原来由程序员new 的对象,交给程序统一管理
将来如果要使用对象,只需要拿到对象即可
对象由程序管理

DI(Dependency Injection)依赖注入
A对象里有B的属性,B要先赋好值,B里面有C,C要先赋好值,对象和对象之间有关联关系,赋值的过程叫做依赖注入

反射复习
全限定名:包名+类名
1.定义一个测试类
2.定义一个path文件为全限定名格式

反射前提:获取字节码对象,一个类只能有一个字节码对象
法一:Class.forNome(path),前提有全限定名

法二:基于对象获取 前提得有对象
先创建一个对象,通过对象拿到class

法三:基于类名直接调用class,前提得有类

基于上面的字节码对象,我们可以创建对象,获取对象的方法,属性,构造器等
这里以构造器为例

getConstructors代表获取所有构造器:全参和无参
输出结果:

getConstructor指定要拿到的构造器,如果不传参默认拿到的是空参构造器

如果传参,那么参数是可变的
指定拿全参,那么就把所有环境数据类型的参数都传进来

通过空参构造器创建一个新的实例对象
输出对象


反射还有的功能:获取方法
通过反射调用方法
setName:方法名称 String.class参数类型
invoke执行 通过environment对象调一个有参数的setName进行输出环境对象

这里目的就是通过字节码对象,创建出来environment对象

单例模式:
1.新建Student类
2.定义私有属性
3.再建一个StudentTest测试类
4.单例模式:要求创建构造器必须是私有化private Student(){},外部类不能访问,并创建Student对象,可以在构造器所在的类中创建对象
书写单例模式分成两种,一种是懒汉式,一种是饿汉式
懒汉式:将来用到Student对象,用就给,不用就不给
饿汉式:要还是不要,都会提前给出来

现在给了一个方法,有对象才能调用newInstance方法,现在目的通过newImstance创建对象,但没对象,所以这个方法不能像现在这样是实例方法,必须加static变成类方法,通过类名调用newInstance方法

输出结果还是false,为什么?
因为每次创建一个newInstance对象都会返回一个新的student对象
下边实现饿汉式和懒汉式

硬编码问题:服务器的端口号,发送端创建socket对象时的IP地址和端口号等是常需要修改的部分,所以我们统一放到配置文件config.xml中




key:gatherFilePath value:D:\……
步骤2:引入dom4j依赖


单例:单个实例,管理员有一个就行,管理所有事情

配置模块:在common包下面新建Configuration接口,拿到各个模块对象

同时再建一个实现类ConfigutationImpl实现Configuration接口,重写方法
然后实现单例模式

修正:上述代码是懒汉式,用的时候才会创建一个对象






我们要实现配置模块,在单例模式书写完,创建出了固定的配置模块实现对象,还需要将读取到的元素通过反射创建对象并放在Map集合中统一管理,如果元素下有二级元素,则为该对象的属性,将属性添加到Properties对象中统一记录,遍历Map集合中所有对象,判断该对象是否为ConfigurationAware类型(配置)或PropertiesAware类型(属性),然后进行对象和属性的注入

如果对象,参数属性准备好了,得放在模块里具体实现,指定一套标准,给参数赋值,给模块赋值,使用PropertiesAware接口,并重写init方法,想拿到配置模块的参数必须实现这个PropertiesAware接口,想通过配置模块拿到模块信息,必须实现ConfigurationAware接口,并重写setConfiguration方法


接下来要实现方法以及将属性和配置模块写在ConfigurationImpl中,判断要实现的是属性还是对象,进行相应方法的调用

最终将写好的配置整合在各个模块项目当中

http://www.jsqmd.com/news/563370/

相关文章:

  • Nano vLLM推理框架解析(schedule篇)
  • Qt|HTTP实战到工程落地(6):UploadData 文件上传实现
  • ITG-3200三轴陀螺仪驱动开发与嵌入式集成指南
  • 4个关键步骤:开源散热控制解决Dell G15温度难题
  • Maxwell2D结合origin导出时空径向力三维图与时空傅里叶三维分解图
  • 工业质检中的旋转目标检测:YOLOv8改进方案
  • 谈谈矛盾律和排中律中的“矛盾”
  • ssm+java2026年毕设体育网站前端设计【源码+论文】
  • 在Java中,如何在学生ID重复时停止后续代码执行
  • 基于模型预测控制的微电网多时间尺度协调优化调度方法
  • STM32环境监测系统在烟花爆竹仓库的应用
  • 猫抓插件终极指南:3分钟学会网页视频下载的完整教程
  • 【Web安全】iframe注入漏洞从入门到实战
  • Kurento Media Server与OpenVidu集成:打造企业级视频会议系统
  • 【OSG学习笔记】Day 23: ClipNode(动态裁剪)
  • 嵌入式系统中SipHash轻量级哈希实现与优化
  • 告别联网依赖!手把手教你用Vosk在Unity中实现离线语音控制(2024最新版)
  • 搜索引擎学习笔记-概要
  • 污泥沉降比检测方法研究
  • MySQL和Oracle有啥区别 编程新手入门指南
  • 创新实训第一周总结
  • VCAD2022压力容器专用CAD插件|兼容全版本AutoCAD|化工设计绘图高效利器
  • XUnity.AutoTranslator:如何为Unity游戏构建高效的多语言本地化系统
  • 教你把歌曲原声调小的5个技巧!简单又好用 赶紧收藏
  • HarmonyOS6 ArkTS ListItem设置划出组件
  • 嵌入式NTP客户端库:高精度时间同步与自动时区管理
  • 自学嵌入式第一天
  • 多行业适配螺杆泵及泵送系统供应商:进口螺杆泵配件、锂电池专用螺杆泵、食品级螺杆泵、高压螺杆泵、不锈钢螺杆泵、加药螺杆泵选择指南 - 优质品牌商家
  • WooCommerce 高级报告与统计 – 订单、产品与客户报告 WordPress插件SQL注入[ CVE-2026-24993 ]
  • 3D Slicer新手必看:如何用窗宽窗位优化CT图像显示效果(附VTK对比)