1.java的码分xml的解析方式有什么,他们的码分解析流程是怎么样的,有什么区别
2.Javaè¯è¨çç¹ç¹
3.springcloud2022ï¼
4.第7讲 | int和Integer有什么区别?
5.javaå·¥ä½åç
6.Java判断Integer相等-应该这么这样用
java的码分xml的解析方式有什么,他们的码分解析流程是怎么样的,有什么区别
答:4种。码分(或者说是码分惠生活源码两种,因为JDOM和DOM4J是码分DOM的两个特殊情况)
1.SAX解析
解析方式是事件驱动机制!
SAX解析器,码分逐行读取XML文件解析,码分每当解析到一个标签的码分开始/结束/内容/属性时,触发事件。码分
可以在这些事件发生时,码分编写程序进行相应的码分处理。
优点:
分析能够立即开始,码分而不是码分等待所有的数据被处理。
逐行加载,节省内存,走强金牛指标源码有助于解析大于系统内存的文档。
有时不必解析整个文档,它可以在某个条件得到满足时停止解析。
缺点:
1.单向解析,无法定位文档层次,无法同时访问同一个文档的不同部分数据(因为逐行解析,当解析第n行时,第n-1行)已经被释放了,无法再对其进行操作)。
2. 无法得知事件发生时元素的层次, 只能自己维护节点的父/子关系。
3. 只读解析方式, 无法修改XML文档的内容。
2. DOM解析
是用与平台和语言无关的方式表示XML文档的官方W3C标准,分析该结构通常需要加载整个 文档和内存中建立文档树模型。程序员可以通过操作文档树, 来完成数据的获取 修改 删除等。
优点:
文档在内存中加载, 允许对数据和结构做出更改。访问是鹰潭安卓源码双向的,可以在任何时候在树中双向解析数据。
缺点:
文档全部加载在内存中 , 消耗资源大。
3. JDOM解析
目的是成为Java特定文档模型,它简化与XML的交互并且比使用DOM实现更快。由于是第一 个Java特定模型,JDOM一直得到大力推广和促进。
JDOM文档声明其目的是“使用%(或更少)的精力解决%(或更多)Java/XML问题” (根据学习曲线假定为%)
优点:
使用具体类而不是接口,简化了DOM的API。
大量使用了Java集合类,方便了Java开发人员。
缺点:
没有较好的灵活性。
性能不是那么优异。
4. DOM4J解析
它是JDOM的一种智能分支。它合并了许多超出基本XML文档表示的功能,包括集成的XPath 支持、XML Schema支持以及用于大文档或流化文档的发卡系统源码搭建基于事件的处理。它还提供了构建文档表示的选项, DOM4J是一个非常优秀的Java XML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一 个开放源代码的软件。如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML。
目前许多开源项目中大量采用DOM4J , 例如:Hibernate。
Javaè¯è¨çç¹ç¹
ä¸ãJavaè¯è¨ç¹ç¹
Javaæ¯ä¸ç§è·¨å¹³å°ï¼éåäºåå¸å¼è®¡ç®ç¯å¢çé¢å对象ç¼ç¨è¯è¨ã
å ·ä½æ¥è¯´ï¼å®å ·æå¦ä¸ç¹æ§ï¼
ç®åæ§ãé¢å对象ãåå¸å¼ã解éåãå¯é ãå®å ¨ãå¹³å°æ å ³ãå¯ç§»æ¤ãé«æ§è½ãå¤çº¿ç¨ãå¨ææ§çã
ä¸é¢æ们å°éç¹ä»ç»Javaè¯è¨çé¢å对象ãå¹³å°æ å ³ãåå¸å¼ãå¤çº¿ç¨ãå¯é åå®å ¨çç¹æ§ã
1.é¢å对象
é¢åå¯¹è±¡å ¶å®æ¯ç°å®ä¸ç模åçèªç¶å»¶ä¼¸ãç°å®ä¸çä¸ä»»ä½å®ä½é½å¯ä»¥çä½æ¯å¯¹è±¡ã对象ä¹é´éè¿æ¶æ¯ç¸äºä½ç¨ãå¦å¤ï¼ç°å®ä¸çä¸ä»»ä½å®ä½é½å¯å½å±äºæç±»äºç©ï¼ä»»ä½å¯¹è±¡é½æ¯æä¸ç±»äºç©çå®ä¾ãå¦æè¯´ä¼ ç»çè¿ç¨å¼ç¼ç¨è¯è¨æ¯ä»¥è¿ç¨ä¸ºä¸å¿ä»¥ç®æ³ä¸ºé©±å¨çè¯ï¼é¢å对象çç¼ç¨è¯è¨åæ¯ä»¥å¯¹è±¡ä¸ºä¸å¿ä»¥æ¶æ¯ä¸ºé©±å¨ãç¨å ¬å¼è¡¨ç¤ºï¼è¿ç¨å¼ç¼ç¨è¯è¨ä¸ºï¼ç¨åº=ç®æ³+æ°æ®ï¼é¢å对象ç¼ç¨è¯è¨ä¸ºï¼ç¨åº=对象+æ¶æ¯ã
ææé¢å对象ç¼ç¨è¯è¨é½æ¯æä¸ä¸ªæ¦å¿µï¼å°è£ ãå¤ææ§å继æ¿ï¼Javaä¹ä¸ä¾å¤ãç°å®ä¸çä¸ç对象åæå±æ§åè¡ä¸ºï¼æ å°å°è®¡ç®æºç¨åºä¸ï¼å±æ§å表示对象çæ°æ®ï¼è¡ä¸ºè¡¨ç¤ºå¯¹è±¡çæ¹æ³ï¼å ¶ä½ç¨æ¯å¤çæ°æ®æåå¤ç交äºï¼ãæè°å°è£ ï¼å°±æ¯ç¨ä¸ä¸ªèªä¸»å¼æ¡æ¶æ对象çæ°æ®åæ¹æ³èå¨ä¸èµ·å½¢æä¸ä¸ªæ´ä½ãå¯ä»¥è¯´ï¼å¯¹è±¡æ¯æ¯æå°è£ çæ段ï¼æ¯å°è£ çåºæ¬åä½ãJavaè¯è¨çå°è£ æ§è¾å¼ºï¼å 为Javaæ å ¨ç¨åéï¼æ 主å½æ°ï¼å¨Javaä¸ç»å¤§é¨åæåæ¯å¯¹è±¡ï¼åªæç®åçæ°åç±»åãå符类ååå¸å°ç±»åé¤å¤ãè对äºè¿äºç±»åï¼Javaä¹æä¾äºç¸åºç对象类å以便ä¸å ¶ä»å¯¹è±¡äº¤äºæä½ã
å¤ææ§å°±æ¯å¤ç§è¡¨ç°å½¢å¼ï¼å ·ä½æ¥è¯´ï¼å¯ä»¥ç¨âä¸ä¸ªå¯¹å¤æ¥å£ï¼å¤ä¸ªå å¨å®ç°æ¹æ³â表示ã举ä¸ä¸ªä¾åï¼è®¡ç®æºä¸çå æ å¯ä»¥åå¨åç§æ ¼å¼çæ°æ®ï¼å æ¬æ´åï¼æµ®ç¹æå符ãä¸ç®¡åå¨çæ¯ä½ç§æ°æ®ï¼å æ çç®æ³å®ç°æ¯ä¸æ ·çãé对ä¸åçæ°æ®ç±»åï¼ç¼ç¨äººåä¸å¿ æå·¥éæ©ï¼åªé使ç¨ç»ä¸æ¥å£åï¼ç³»ç»å¯èªå¨éæ©ãè¿ç®ç¬¦éè½½ï¼operatoroverload)ä¸ç´è¢«è®¤ä¸ºæ¯ä¸ç§ä¼ç§çå¤ææºå¶ä½ç°ï¼ä½ç±äºèèå°å®ä¼ä½¿ç¨åºåå¾é¾ä»¥ç解ï¼æ以Javaæåè¿æ¯æå®åæ¶äºã
继æ¿æ¯æä¸ä¸ªå¯¹è±¡ç´æ¥ä½¿ç¨å¦ä¸å¯¹è±¡çå±æ§åæ¹æ³ãäºå®ä¸ï¼æ们éå°çå¾å¤å®ä½é½æ继æ¿çå«ä¹ãä¾å¦ï¼è¥æ汽车çæä¸ä¸ªå®ä½ï¼å®å¯ä»¥åæå¤ä¸ªåå®ä½ï¼å¦ï¼å¡è½¦ãå ¬å ±æ±½è½¦çãè¿äºåå®ä½é½å ·æ汽车çç¹æ§ï¼å æ¤ï¼æ±½è½¦æ¯å®ä»¬çâç¶äº²âï¼èè¿äºåå®ä½åæ¯æ±½è½¦çâå©åâãJavaæä¾ç»ç¨æ·ä¸ç³»åç±»ï¼classï¼ï¼Javaçç±»æå±æ¬¡ç»æï¼åç±»å¯ä»¥ç»§æ¿ç¶ç±»çå±æ§åæ¹æ³ãä¸å¦å¤ä¸äºé¢å对象ç¼ç¨è¯è¨ä¸åï¼Javaåªæ¯æåä¸ç»§æ¿ã
2�å¹³å°æ å ³æ§
Javaæ¯å¹³å°æ å ³çè¯è¨æ¯æç¨Javaåçåºç¨ç¨åºä¸ç¨ä¿®æ¹å°±å¯å¨ä¸åç软硬件平å°ä¸è¿è¡ãå¹³å°æ å ³æ两ç§ï¼æºä»£ç 级åç®æ 代ç 级ãCåC++å ·æä¸å®ç¨åº¦çæºä»£ç 级平å°æ å ³ï¼è¡¨æç¨CæC++åçåºç¨ç¨åºä¸ç¨ä¿®æ¹åªééæ°ç¼è¯å°±å¯ä»¥å¨ä¸åå¹³å°ä¸è¿è¡ã
Java主è¦é Javaèææºï¼JVMï¼å¨ç®æ ç 级å®ç°å¹³å°æ å ³æ§ãJVMæ¯ä¸ç§æ½è±¡æºå¨ï¼å®éçå¨å ·ä½æä½ç³»ç»ä¹ä¸ï¼æ¬èº«å ·æä¸å¥èæºå¨æ令ï¼å¹¶æèªå·±çæ ãå¯åå¨ç»çãä½JVMé常æ¯å¨è½¯ä»¶ä¸èä¸æ¯å¨ç¡¬ä»¶ä¸å®ç°ãï¼ç®åï¼SUNç³»ç»å ¬å¸å·²ç»è®¾è®¡å®ç°äºJavaè¯çï¼ä¸»è¦ä½¿ç¨å¨ç½ç»è®¡ç®æºNCä¸ã
å¦å¤ï¼Javaè¯ççåºç°ä¹ä¼ä½¿Javaæ´å®¹æåµå ¥å°å®¶ç¨çµå¨ä¸ãï¼JVMæ¯Javaå¹³å°æ å ³çåºç¡ï¼å¨JVMä¸ï¼æä¸ä¸ªJava解éå¨ç¨æ¥è§£éJavaç¼è¯å¨ç¼è¯åçç¨åºãJavaç¼ç¨äººåå¨ç¼åå®è½¯ä»¶åï¼éè¿Javaç¼è¯å¨å°Javaæºç¨åºç¼è¯ä¸ºJVMçåè代ç ãä»»ä½ä¸å°æºå¨åªè¦é å¤äºJava解éå¨ï¼å°±å¯ä»¥è¿è¡è¿ä¸ªç¨åºï¼èä¸ç®¡è¿ç§åèç æ¯å¨ä½ç§å¹³å°ä¸çæçãå¦å¤ï¼Javaéç¨çæ¯åºäºIEEEæ åçæ°æ®ç±»åãéè¿JVMä¿è¯æ°æ®ç±»åçä¸è´æ§ï¼ä¹ç¡®ä¿äºJavaçå¹³å°æ å ³æ§ã
Javaçå¹³å°æ å ³æ§å ·ææ·±è¿æä¹ãé¦å ï¼å®ä½¿å¾ç¼ç¨äººåæ梦å¯ä»¥æ±çäºæ ï¼å¼åä¸æ¬¡è½¯ä»¶å¨ä»»æå¹³å°ä¸è¿è¡ï¼åæäºå®ï¼è¿å°å¤§å¤§å å¿«åä¿è¿è½¯ä»¶äº§åçå¼åãå ¶æ¬¡Javaçå¹³å°æ å ³æ§æ£å¥½è¿åäºâç½ç»è®¡ç®æºâææ³ãå¦æ大é常ç¨çåºç¨è½¯ä»¶ï¼å¦åå¤ç软件çï¼é½ç¨Javaéæ°ç¼åï¼å¹¶ä¸æ¾å¨æ个Internetæå¡å¨ä¸ï¼é£ä¹å ·æNCçç¨æ·å°ä¸éè¦å ç¨å¤§é空é´å®è£ 软件ï¼ä»ä»¬åªéè¦ä¸ä¸ª
Java解éå¨ï¼æ¯å½éè¦ä½¿ç¨æç§åºç¨è½¯ä»¶æ¶ï¼ä¸è½½è¯¥è½¯ä»¶çåè代ç å³å¯ï¼è¿è¡ç»æä¹å¯ä»¥ååæå¡å¨ãç®åï¼å·²ææ°å®¶å ¬å¸å¼å§ä½¿ç¨è¿ç§æ°åç计ç®æ¨¡å¼æçèªå·±çä¼ä¸ä¿¡æ¯ç³»ç»ã
3�åå¸å¼
åå¸å¼å æ¬æ°æ®åå¸åæä½åå¸ãæ°æ®åå¸æ¯ææ°æ®å¯ä»¥åæ£å¨ç½ç»çä¸å主æºä¸ï¼æä½åå¸æ¯ææä¸ä¸ªè®¡ç®åæ£å¨ä¸å主æºä¸å¤çã
Javaæ¯æWWW客æ·æº/æå¡å¨è®¡ç®æ¨¡å¼ï¼å æ¤ï¼å®æ¯æè¿ä¸¤ç§åå¸æ§ã对äºåè ï¼Javaæä¾äºä¸ä¸ªå«ä½URLç对象ï¼å©ç¨è¿ä¸ªå¯¹è±¡ï¼ä½ å¯ä»¥æå¼å¹¶è®¿é®å ·æç¸åURLå°åä¸ç对象ï¼è®¿é®æ¹å¼ä¸è®¿é®æ¬å°æ件系ç»ç¸åã对äºåè ï¼Javaçappletå°ç¨åºå¯ä»¥ä»æå¡å¨ä¸è½½å°å®¢æ·ç«¯ï¼å³é¨å计ç®å¨å®¢æ·ç«¯è¿è¡ï¼æé«ç³»ç»æ§è¡æçã
Javaæä¾äºä¸æ´å¥ç½ç»ç±»åºï¼å¼å人åå¯ä»¥å©ç¨ç±»åºè¿è¡ç½ç»ç¨åºè®¾è®¡ï¼æ¹ä¾¿å¾å®ç°Javaçåå¸å¼ç¹æ§ã
4�å¯é æ§åå®å ¨æ§
Javaæå设计ç®çæ¯åºç¨äºçµåç±»æ¶è´¹äº§åï¼å æ¤è¦æ±è¾é«çå¯é æ§ãJavaè½ç¶æºäºC++ï¼ä½å®æ¶é¤äºè®¸å¤C++ä¸å¯é å ç´ ï¼å¯ä»¥é²æ¢è®¸å¤ç¼ç¨é误ãé¦å ï¼Javaæ¯å¼ºç±»åçè¯è¨ï¼è¦æ±æ¾å¼çæ¹æ³å£°æï¼è¿ä¿è¯äºç¼è¯å¨å¯ä»¥åç°æ¹æ³è°ç¨é误ï¼ä¿è¯ç¨åºæ´å å¯é ï¼å ¶æ¬¡ï¼Javaä¸æ¯ææéï¼è¿æç»äºå åçéæ³è®¿é®ï¼ç¬¬ä¸ï¼Javaçèªå¨åå æ¶éé²æ¢äºå å丢失çå¨æå ååé 导è´çé®é¢ï¼ç¬¬åï¼Java解éå¨è¿è¡æ¶å®æ½æ£æ¥ï¼å¯ä»¥åç°æ°ç»åå符串访é®çè¶çï¼æåï¼Javaæä¾äºå¼å¸¸å¤çæºå¶ï¼ç¨åºåå¯ä»¥æä¸ç»é误代ç æ¾å¨ä¸ä¸ªå°æ¹ï¼è¿æ ·å¯ä»¥ç®åé误å¤çä»»å¡ä¾¿äºæ¢å¤ã
ç±äºJava主è¦ç¨äºç½ç»åºç¨ç¨åºå¼åï¼å æ¤å¯¹å®å ¨æ§æè¾é«çè¦æ±ãå¦æ没æå®å ¨ä¿è¯ï¼ç¨æ·ä»ç½ç»ä¸è½½ç¨åºæ§è¡å°±é常å±é©ãJavaéè¿èªå·±çå®å ¨æºå¶é²æ¢äºç æ¯ç¨åºç产çåä¸è½½ç¨åºå¯¹æ¬å°ç³»ç»çå¨èç ´åãå½Javaåèç è¿å ¥è§£éå¨æ¶ï¼é¦å å¿ é¡»ç»è¿åèç æ ¡éªå¨çæ£æ¥ï¼ç¶åï¼Java解éå¨å°å³å®ç¨åºä¸ç±»çå åå¸å±ï¼éåï¼ç±»è£ è½½å¨è´è´£ææ¥èªç½ç»çç±»è£ è½½å°åç¬çå ååºåï¼é¿å åºç¨ç¨åºä¹é´ç¸äºå¹²æ°ç ´åãæåï¼å®¢æ·ç«¯ç¨æ·è¿å¯ä»¥éå¶ä»ç½ç»ä¸è£ è½½çç±»åªè½è®¿é®æäºæ件系ç»ã
ä¸è¿°å ç§æºå¶ç»åèµ·æ¥ï¼ä½¿å¾Javaæ为å®å ¨çç¼ç¨è¯è¨ã
5�å¤çº¿ç¨
线ç¨æ¯æä½ç³»ç»çä¸ç§æ°æ¦å¿µï¼å®å被称ä½è½»éè¿ç¨ï¼æ¯æ¯ä¼ ç»è¿ç¨æ´å°çå¯å¹¶åæ§è¡çåä½ã
CåC++éç¨å线ç¨ä½ç³»ç»æï¼èJavaå´æä¾äºå¤çº¿ç¨æ¯æã
Javaå¨ä¸¤æ¹é¢æ¯æå¤çº¿ç¨ãä¸æ¹é¢ï¼Javaç¯å¢æ¬èº«å°±æ¯å¤çº¿ç¨çãè¥å¹²ä¸ªç³»ç»çº¿ç¨è¿è¡è´è´£å¿ è¦çæ ç¨åå åæ¶ï¼ç³»ç»ç»´æ¤çç³»ç»çº§æä½ï¼å¦ä¸æ¹é¢ï¼Javaè¯è¨å ç½®å¤çº¿ç¨æ§å¶ï¼å¯ä»¥å¤§å¤§ç®åå¤çº¿ç¨åºç¨ç¨åºå¼åãJavaæä¾äºä¸ä¸ªç±»Threadï¼ç±å®è´è´£å¯å¨è¿è¡ï¼ç»æ¢çº¿ç¨ï¼å¹¶å¯æ£æ¥çº¿ç¨ç¶æãJavaç线ç¨è¿å æ¬ä¸ç»åæ¥åè¯ãè¿äºåè¯è´è´£å¯¹çº¿ç¨å®è¡å¹¶åæ§å¶ãå©ç¨Javaçå¤çº¿ç¨ç¼ç¨æ¥å£ï¼å¼å人åå¯ä»¥æ¹ä¾¿å¾ååºæ¯æå¤çº¿ç¨çåºç¨ç¨åºï¼æé«ç¨åºæ§è¡æçãå¿ é¡»æ³¨æå°æ¯ï¼Javaçå¤çº¿ç¨æ¯æå¨ä¸å®ç¨åº¦ä¸åè¿è¡æ¶æ¯æå¹³å°çéå¶ãä¾å¦ï¼å¦ææä½ç³»ç»æ¬èº«ä¸æ¯æå¤çº¿ç¨ï¼Javaçå¤çº¿ç¨ç¹æ§å¯è½å°±è¡¨ç°ä¸åºæ¥ã
äºãJavaå°ç¨åºååºç¨ç¨åº
ç¨Javaå¯ä»¥å两ç§ç±»åçç¨åºï¼å°ç¨åºï¼åå«JavaAppletï¼ååºç¨ç¨åºï¼JavaApplicationï¼ãå°ç¨åºæ¯åµå ¥å¨HTMLææ¡£ä¸çJavaç¨åºï¼èJavaåºç¨ç¨åºæ¯ä»å½ä»¤è¡è¿è¡çç¨åºã对Javaèè¨ï¼Javaå°ç¨åºç大å°åå¤ææ§é½æ²¡æéå¶ãäºå®ä¸ï¼Javaå°ç¨åºæäºæ¹é¢æ¯Javaåºç¨ç¨åºæ´å¼ºå¤§ãä½æ¯ç±äºç®åInterneté讯é度æéï¼å æ¤å¤§å¤æ°å°ç¨åºè§æ¨¡è¾å°ãå°ç¨åºååºç¨ç¨åºä¹é´çææ¯å·®å«å¨äºè¿è¡ç¯å¢ã
Javaåºç¨ç¨åºè¿è¡å¨æç®åçç¯å¢ä¸ï¼å®çå¯ä¸å¤é¨è¾å ¥å°±æ¯å½ä»¤è¡åæ°ãå¦ä¸æ¹é¢ï¼Javaå°ç¨åºåéè¦æ¥èªWebæµè§å¨ç大éä¿¡æ¯ï¼å®éè¦ç¥éä½æ¶å¯å¨ï¼ä½æ¶æ¾å ¥æµè§å¨çªå£ï¼ä½å¤ï¼ä½æ¶æ¿æ´»å ³éãç±äºè¿ä¸¤ç§ä¸åçæ§è¡ç¯å¢ï¼å°ç¨åºååºç¨ç¨åºçæä½è¦æ±ä¸åã
ç±äºWWW使å°ç¨åºçåå¸åå便å©ï¼å æ¤å°ç¨åºæ´éåä½ä¸ºInternetä¸çåºç¨ç¨åºãç¸åï¼éç½ç»ç³»ç»åå åè¾å°çç³»ç»æ´éåç¨Javaåºç¨ç¨åºèè¾å°ç¨Javaå°ç¨åºå®ç°ãå¦å¤ï¼Javaåºç¨ç¨åºä¹å¾å®¹æ以Internet为åºç¡ç¯å¢ï¼äºå®ä¸æäºä¼ç§çJavaåºç¨ç¨åºæ£æ¯å¦æ¤ã
springcloudï¼
å¾®æå¡æ¡æ¶ä¹SpringCloudç®ä»
å¨äºè§£SpringCloudä¹åå äºè§£ä¸ä¸å¾®æå¡æ¶æéè¦èéçæ ¸å¿å ³é®ç¹ï¼å¦ä¸å¾ï¼
对äºä»¥ä¸çæ ¸å¿å ³é®ç¹çå¤çï¼ä¸éè¦æ们éå¤é 车轮ï¼SpringCloudå·²ç»å¸®æ们éæäºï¼å®ä½¿ç¨SpringBooté£æ ¼å°ä¸äºæ¯è¾æççå¾®æå¡æ¡æ¶ç»åèµ·æ¥ï¼å±è½æäºå¤æçé ç½®åå®ç°åçï¼ä¸ºå¿«éæ建微æå¡æ¶æçåºç¨æä¾äºä¸å¥åºç¡è®¾æ½å·¥å ·åå¼åæ¯æã
SpringCloudææä¾çæ ¸å¿åè½å å«ï¼
SpringCloudæ¶æå¾
SpringCloudå项ç®
SpringCloudæä¸çå项ç®å¤§è´å¯ä»¥å为两类ï¼
å¦ä¸ï¼
1.SpringCloudä¸SpringBoot
SpringBootå¯ä»¥è¯´æ¯å¾®æå¡æ¶æçæ ¸å¿ææ¯ä¹ä¸ãéè¿å¨SpringBootåºç¨ä¸æ·»å SpringMVCä¾èµï¼å°±å¯ä»¥å¿«éå®ç°åºäºRESTæ¶æçæå¡æ¥å£ï¼å¹¶ä¸å¯ä»¥æä¾å¯¹HTTPæ åå¨ä½çæ¯æãèä¸SpringBooté»è®¤æä¾JackJsonåºååæ¯æï¼å¯ä»¥è®©æå¡æ¥å£è¾å ¥ãè¾åºæ¯æJSONçãå æ¤ï¼å½ä½¿ç¨SpringCloudè¿è¡å¾®æå¡æ¶æå¼åæ¶ï¼ä½¿ç¨SpringBootæ¯ä¸æ¡å¿ ç»ä¹è·¯ã
2.SpringCloudä¸æå¡æ²»ç(Eureka)
æå¡æ²»çæ¯SpringCloudçæ ¸å¿ï¼å¨å®ç°ä¸å ¶æä¾äºä¸¤ä¸ªéæ©ï¼å³ConsulåNetflixçEurekaã
Eurekaæä¾äºæå¡æ³¨åä¸å¿ãæå¡åç°å®¢æ·ç«¯ï¼ä»¥å注åæå¡çUIçé¢åºç¨ã
å¨Eurekaçå®ç°ä¸ï¼èç¹ä¹é´ç¸äºå¹³çï¼æé¨å注åä¸å¿âææâä¹ä¸ä¼å¯¹æ´ä¸ªåºç¨é æå½±åï¼å³ä½¿é群åªå©ä¸ä¸ªèç¹åæ´»ï¼ä¹å¯ä»¥æ£å¸¸å°æ²»çæå¡ãå³ä½¿æææå¡æ³¨åèç¹é½å®æºï¼Eureka客æ·ç«¯ä¸æç¼åçæå¡å®ä¾å表信æ¯ï¼ä¹å¯è®©æå¡æ¶è´¹è è½å¤æ£å¸¸å·¥ä½ï¼ä»èä¿éå¾®æå¡ä¹é´äºç¸è°ç¨çå¥å£®æ§ååºç¨çå¼¹æ§ã
3.SpringCloudä¸å®¢æ·ç«¯è´è½½åè¡¡(Ribbon)
Ribboné»è®¤ä¸Eureakè¿è¡æ ç¼æ´åï¼å½å®¢æ·ç«¯å¯å¨çæ¶åï¼ä»Eurekaæå¡å¨ä¸è·åä¸ä»½æå¡æ³¨åå表并维æ¤å¨æ¬å°ï¼å½æå¡æ¶è´¹è éè¦è°ç¨æå¡æ¶ï¼Ribbonå°±ä¼æ ¹æ®è´è½½åè¡¡çç¥éæ©ä¸ä¸ªåéçæå¡æä¾è å®ä¾å¹¶è¿è¡è®¿é®ã
SpringCloudéè¿éæNetflixçFeign项ç®ï¼ä¸ºå¼åè æä¾äºå£°æå¼æå¡è°ç¨ï¼ä»èç®åäºå¾®æå¡ä¹é´çè°ç¨å¤çæ¹å¼ã并ä¸é»è®¤Feign项ç®éæäºRibbonï¼ä½¿å¾å£°æå¼è°ç¨ä¹æ¯æ客æ·ç«¯è´è½½åè¡¡åè½ã
4.SpringCloudä¸å¾®æå¡å®¹éãé级(Hystrix)
为äºç»å¾®æå¡æ¶ææä¾æ´å¤§çå¼¹æ§ï¼å¨SpringCloudä¸ï¼éè¿éæNetflixä¸å项ç®Hystrixï¼éè¿ææä¾ç@HystrixCommand注解å¯ä»¥è½»æ¾ä¸ºæ们æå¼åçå¾®æå¡æä¾å®¹éãåéãé级çåè½ãæ¤å¤ï¼Hystrixä¹é»è®¤éæå°Feignå项ç®ä¸ã
Hystrixæ¯æ ¹æ®âæè·¯å¨â模å¼èå建ãå½Hystrixçæ§å°ææå¡åå åçæ éä¹åï¼å°±ä¼è¿å ¥æå¡çæå¤çï¼å¹¶åè°ç¨æ¹è¿åä¸ä¸ªç¬¦åé¢æçæå¡é级å¤çï¼fallbackï¼ï¼èä¸æ¯é¿æ¶é´ççå¾ æè æåºè°ç¨å¼å¸¸ï¼ä»èä¿éæå¡è°ç¨æ¹ç线ç¨ä¸ä¼è¢«é¿æ¶é´ãä¸å¿ è¦å°å ç¨ï¼é¿å æ éå¨åºç¨ä¸çè延é æçéªå´©æåºã
èHystrixç仪表ç项ç®ï¼Dashboardï¼å¯ä»¥çæ§å个æå¡è°ç¨ææ¶èçæ¶é´ã请æ±æ°ãæåççï¼éè¿è¿ç§è¿ä¹å®æ¶ççæ§ååè¦ï¼å¯ä»¥åæ¶åç°ç³»ç»ä¸æ½å¨é®é¢å¹¶è¿è¡å¤çã
5.SpringCloudä¸æå¡ç½å ³(Zuul)
SpringCloudéè¿éæNetflixä¸çZuulå®ç°APIæå¡ç½å ³åè½ï¼æä¾å¯¹è¯·æ±çè·¯ç±åè¿æ»¤ä¸¤ä¸ªåè½
è·¯ç±åè½è´è´£å°å¤é¨è¯·æ±è½¬åå°å ·ä½çå¾®æå¡å®ä¾ä¸ï¼æ¯å®ç°å¤é¨è®¿é®ç»ä¸å ¥å£çåºç¡ã
è¿æ»¤å¨åè½åè´è´£å¯¹è¯·æ±çå¤çè¿ç¨è¿è¡å¹²é¢ï¼æ¯å®ç°è¯·æ±æ ¡éªãæå¡èåçåè½çåºç¡ã
éè¿Zuulï¼å¯ä»¥å°ç»ç²åº¦çæå¡ç»åèµ·æ¥æä¾ä¸ä¸ªç²ç²åº¦çæå¡ï¼ææ请æ±é½å¯¼å ¥ä¸ä¸ªç»ä¸çå ¥å£ï¼å¯¹å¤æ´ä¸ªæå¡åªéè¦æ´é²ä¸ä¸ªAPIæ¥å£ï¼å±è½äºæå¡ç«¯çå®ç°ç»èãéè¿Zuulçåå代çåè½ï¼å¯ä»¥å®ç°è·¯ç±å¯»åï¼å°è¯·æ±è½¬åå°å端çç²ç²åº¦æå¡ä¸ï¼å¹¶åä¸äºéç¨çé»è¾å¤çãæ¤å¤ï¼Zuulé»è®¤ä¼ä¸Eurekaæå¡å¨è¿è¡æ´åï¼èªå¨ä»Eurekaæå¡å¨ä¸è·åææ注åçæå¡å¹¶è¿è¡è·¯ç±æ å°ï¼å®ç°APIæå¡ç½å ³èªå¨é ç½®ã
6.SpringCloudä¸æ¶æ¯ä¸é´ä»¶(Stream)
SpringCloud为ç®ååºäºæ¶æ¯çå¼åï¼æä¾äºStreamå项ç®ï¼éè¿å»ºç«æ¶æ¯åºç¨æ½è±¡å±ï¼æ建äºæ¶æ¯æ¶åãåç»æ¶è´¹åæ¶æ¯åççåè½å¤çï¼å°ä¸å¡åºç¨ä¸çæ¶æ¯æ¶åä¸å ·ä½æ¶æ¯ä¸é´ä»¶è¿è¡è§£è¦ï¼ä½¿å¾®æå¡åºç¨å¼åä¸å¯ä»¥é常æ¹ä¾¿å°ä¸KafkaåRabbitMQçæ¶æ¯ä¸é´ä»¶è¿è¡éæã
SpringCloudBusåºäºStreamè¿è¡æ©å±ï¼å¯ä»¥ä½ä¸ºå¾®æå¡ä¹é´çäºä»¶ãæ¶æ¯æ»çº¿ï¼ç¨äºæå¡é群ä¸ç¶æååçä¼ æã
æ¯å¦SpringCloudConfigåå©Busï¼å¯ä»¥å®ç°é ç½®çå¨æå·æ°å¤çã
7.SpringCloudä¸åå¸å¼é ç½®ä¸å¿(Config)
é对微æå¡æ¶æä¸çé ç½®æ件管çéæ±ï¼SpringCloudæä¾äºä¸ä¸ªConfigå项ç®ãSpringCloudConfigå ·æä¸å¿åãçæ¬æ§å¶ãæ¯æå¨ææ´æ°åè¯è¨ç¬ç«çç¹æ§ã
å¨Configå项ç®ä¸å°å¾®æå¡åºç¨å为两ç§è§è²ï¼é ç½®æå¡å¨ï¼ConfigServerï¼åé 置客æ·ç«¯ï¼ConfigClientï¼ã使ç¨é ç½®æå¡å¨éä¸å°ç®¡çææé ç½®å±æ§æ件ï¼é ç½®æå¡ä¸å¿å¯ä»¥å°é ç½®å±æ§æ件åå¨å°GitãSVNçå ·æçæ¬ç®¡çä»åºä¸ï¼ä¹å¯ä»¥åæ¾å¨æ件系ç»ä¸ãé»è®¤éç¨Gitçæ¹å¼è¿è¡åå¨ï¼å æ¤å¯ä»¥å¾å®¹æå°å¯¹é ç½®æ件è¿è¡ä¿®æ¹ï¼å¹¶å®ç°çæ¬æ§å¶ã
8.SpringCloudä¸å¾®æå¡é¾è·¯è¿½è¸ª(Sleuth)
SpringCloudä¸çSleuthå项ç®ä¸ºå¼åè æä¾äºå¾®æå¡ä¹é´è°ç¨çé¾è·¯è¿½è¸ªã
Sleuthæ ¸å¿ææ³å°±æ¯éè¿ä¸ä¸ªå ¨å±çIDå°åå¸å¨åå¾®æå¡æå¡èç¹ä¸ç请æ±å¤ç串èèµ·æ¥ï¼è¿åäºè°ç¨å ³ç³»ï¼å¹¶åå©æ°æ®åç¹ï¼å®ç°å¯¹å¾®æå¡è°ç¨é¾è·¯ä¸çæ§è½æ°æ®çééã
å æ¤ï¼éè¿Sleuthå¯ä»¥å¾æ¸ æ¥å°äºè§£å°ä¸ä¸ªç¨æ·è¯·æ±ç»è¿äºåªäºæå¡ãæ¯ä¸ªæå¡å¤çè±è´¹äºå¤é¿æ¶é´ï¼ä»èå¯ä»¥å¯¹ç¨æ·ç请æ±è¿è¡åæãæ¤å¤ï¼éè¿å°ééçæ°æ®åéç»Zipkinè¿è¡åå¨ãç»è®¡ååæï¼ä»èå¯ä»¥å®ç°å¯è§åçåæåå±ç¤ºï¼å¸®å©å¼åè 对微æå¡å®æ½ä¼åå¤çã
9.SpringCloudä¸å¾®æå¡å®å ¨(Security)
SpringCloudSecurity为æ们æä¾äºä¸ä¸ªè®¤è¯åé´æçå®å ¨æ¡æ¶ï¼å®ç°äºèµæºææã令ç管ççåè½ï¼åæ¶ç»åZuulå¯ä»¥å°è®¤è¯ä¿¡æ¯å¨å¾®æå¡è°ç¨è¿ç¨ä¸ç´æ¥ä¼ éï¼ç®åäºæ们è¿è¡å®å ¨ç®¡æ§çå¼åã
SpringCloudSecurityé»è®¤æ¯æOAuth2.0认è¯åè®®ï¼å æ¤åç¹ç»å½ä¹å¯ä»¥é常容æå®ç°ï¼å¹¶ä¸OAuth2.0æçæç令çå¯ä»¥ä½¿ç¨JWTçæ¹å¼ï¼è¿ä¸æ¥ç®åäºå¾®æå¡ä¸çå®å ¨ç®¡çã
.SpringCloudçå ¶ä»å项ç®
èªå®ä¹springcloud-gatewayçæå¤ç
ä¸ãåºæ¯
使ç¨springcloudgatewayåï¼æäºçæï¼é®é¢ä¹å°±éä¹èæ¥ï¼æå¡é´è°ç¨æäºhystrixå¯ä»¥åæ¶çæé¤åæ¥å£ãåæå¡çé®é¢ï¼å¯¹ç³»ç»å¾æ帮å©ãä½æ¯ï¼ä¸æ¯ææçæ¥å£é½æ¯æçæ¶é´å å®æçï¼ä¸æ¯ææçæ¥å£é½å¯ä»¥è®¾ç½®ä¸æ ·çè¶ æ¶æ¶é´çï¼
é£ä¹æ们é¢ä¸´ä¸ä¸ªé®é¢ï¼é£å°±æ¯ç¾åä¹çæ¥å£é½å¯ä»¥å¨1så å®ç¾å®æï¼ä½æ¯å°±æ¯é£å 个ç¹æ®æ¥å£ï¼éè¦åå ç§ï¼å åç§ççå¾ æ¶é´ï¼èé»è®¤çæçæ¶é´ååªæä¸ä¸ªã
äºãåæ
å¨åé¢springcloudgatewayæºç 解æä¹è¯·æ±ç¯ä¸æ们ç¥é请æ±ä¼ç»è¿ä¸äºåçè¿æ»¤å¨ï¼GatewayFilterï¼,èspringcloudgatewayçé级çæå¤çå°±æ¯ç±ä¸ä¸ªç¹æ®çè¿æ»¤å¨æ¥å¤ççï¼éè¿æºç åææä»¬å ³æ³¨å°HystrixGatewayFilterFactoryè¿ä¸ªç±»ï¼è¿ä¸ªç±»çä½ç¨å°±æ¯ç产GatewayFilterç¨çï¼æ们çä¸å®çå®ç°
å¯ä»¥çå°çº¢æ¡å¤æåæ建äºä¸ä¸ªå¿åçGatewayFilter对象è¿åï¼è¿ä¸ªå¯¹è±¡å¨æ¥å£è¯·æ±è¿ç¨ä¸ä¼è¢«å è½½å°è¿æ»¤å¨é¾æ¡ä¸ï¼ä»ç»çå°è¿éæ¯å建äºä¸ä¸ªRouteHystrixCommandè¿ä¸ªå½ä»¤å¯¹è±¡ï¼æç»è°ç¨command.toObservable()æ¹æ³å¤ç请æ±ï¼å¦æè¶ æ¶çæè°ç¨resumeWithFallbackæ¹æ³
éè¿æºç åægatewayå¨è·¯ç±æ¶å¯ä»¥æå®HystrixCommandKeyï¼å¹¶ä¸å¯¹HystrixCommandKeyè®¾ç½®è¶ æ¶æ¶é´
ä¸ãæ¹æ¡
ç¥éç½å ³çæçåç就好åäº,èªå®ä¹çæçè¿æ»¤å¨é ç½®å°æ¥å£è¯·æ±è¿ç¨ä¸ï¼ç±è¿æ»¤å¨æ¥è¯»åæ¥å£çæé 置并æ建HystrixObservableCommandå¤ç请æ±ã
èªå®ä¹ä¸ä¸ªç±»XXXGatewayFilterFactory继æ¿AbstractGatewayFilterFactoryï¼å°apiå对åºçtimeouté ç½®åï¼æ¥å®ç°ç»åå°å ·ä½æ¥å£ççæé ç½®ï¼å ·ä½å®ç°å¦ä¸ï¼
packageorg.unicorn.framework.gateway.filter;
importcn.hutool.core.collection.CollectionUtil;
importcom.netflix.hystrix.HystrixCommandGroupKey;
importcom.netflix.hystrix.HystrixCommandKey;
importcom.netflix.hystrix.HystrixCommandProperties;
importcom.netflix.hystrix.HystrixObservableCommand;
importcom.netflix.hystrix.exception.HystrixRuntimeException;
importorg.springframework.beans.factory.ObjectProvider;
importorg.springframework.cloud.gateway.filter.GatewayFilter;
importorg.springframework.cloud.gateway.filter.GatewayFilterChain;
importorg.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
importorg.springframework.cloud.gateway.support.ServerWebExchangeUtils;
importorg.springframework.cloud.gateway.support.TimeoutException;
importorg.springframework.core.annotation.AnnotatedElementUtils;
importorg.springframework.mand;
if(CollectionUtil.isNotEmpty(apiTimeoutList)){
//requestå¹é å±äºé£ç§æ¨¡å¼
ApiHystrixTimeoutapiHystrixTimeout=getApiHystrixTimeout(apiTimeoutList,path);command=newUnicornRouteHystrixCommand(config.getFallbackUri(),exchange,chain,initSetter(apiHystrixTimeout.getApiPattern(),apiHystrixTimeout.getTimeout()));}else{
command=newUnicornRouteHystrixCommand(config.getFallbackUri(),exchange,chain,initSetter(serviceId(exchange),null));
}
returncommand;
}/
***@paramapiTimeoutList*@parampath*@return*/privateApiHystrixTimeoutgetApiHystrixTimeout(ListapiTimeoutList,Stringpath){for(ApiHystrixTimeoutapiTimeoutPattern:apiTimeoutList){
if(this.antPathMatcher.match(apiTimeoutPattern.getApiPattern(),path)){
returnapiTimeoutPattern;
}}
ApiHystrixTimeoutapiHystrixTimeout=newApiHystrixTimeout();
apiHystrixTimeout.setApiPattern("default");
apiHystrixTimeout.timeout=null;
returnapiHystrixTimeout;
}@Override
publicGatewayFilterapply(Configconfig){return(exchange,chain)-{
UnicornRouteHystrixCommandcommand=initUnicornRouteHystrixCommand(exchange,chain,config);
returnMono.create(s-{Subscriptionsub=command.toObservable().subscribe(s::success,s::error,s::success);
s.onCancel(sub::unsubscribe);
}).onErrorResume((Function)throwable-{if(throwableinstanceofHystrixRuntimeException){
HystrixRuntimeExceptione=(HystrixRuntimeException)throwable;
HystrixRuntimeException.FailureTypefailureType=e.getFailureType();switch(failureType){caseTIMEOUT:
returnMono.error(newTimeoutException());
caseCOMMAND_EXCEPTION:{
Throwablecause=e.getCause();
if(causeinstanceofResponseStatusException||AnnotatedElementUtils.findMergedAnnotation(cause.getClass(),ResponseStatus.class)!=null){
returnMono.error(cause);
}}
default:
break;
}}
第7讲 | int和Integer有什么区别?
典型回答:
int是Java中的一种基本数据类型,属于原始数据类型的一种。它是Java编程语言中的8个基本数据类型之一,包括boolean、byte、short、char、int、float、哈希表源码分析double、long。
Integer是int类型的包装类,它是一个对象,包含一个存储数据的int类型的字段,并提供了一些基本操作,如数学运算、int与字符串之间的转换等。在Java 5中,引入了自动装箱和自动拆箱功能,简化了相关编程。
关于Integer的值缓存,这涉及Java 5中的一个改进。传统上,构建Integer对象的方式是直接调用构造器,创建一个新的对象。但实践表明,大部分数据操作都集中在有限的、较小的数值范围内。因此,在Java 5中引入了静态工厂方法valueOf,它利用一个缓存机制,提高了性能。按照Javadoc,这个值默认缓存范围是-到之间。
知识扩展:
1. 理解自动装箱、拆箱
自动装箱是一种语法糖,它实际上是一种语法上的简化。简单来说,Java平台为我们自动进行了一些转换,以保证不同的写法在运行时等价。这些转换发生在编译阶段,生成的字节码是一致的。
2. 源码分析
考察是否阅读过、是否理解JDK源代码可能是部分面试官的关注点。阅读并实践高质量代码也是程序员成长的必经之路。下面我来分析下Integer的源码。
3. 原始类型线程安全
前面提到了线程安全设计,你可能想过,原始数据类型操作是否线程安全。
4. Java原始数据类型和引用类型局限性
从Java平台发展的角度来看,原始数据类型和对象的局限性和演进是值得关注的。
再扩展:
你知道对象的内存结构是什么样的吗?比如,对象头的结构。如何计算或获取某个Java对象的大小?
javaå·¥ä½åç
Javaå·¥ä½åç
ç±åæ¹é¢ç»æï¼
ï¼1ï¼Javaç¼ç¨è¯è¨
ï¼2ï¼Javaç±»æä»¶æ ¼å¼
ï¼3ï¼Javaèææº
ï¼4ï¼Javaåºç¨ç¨åºæ¥å£
å½ç¼è¾å¹¶è¿è¡ä¸ä¸ªJavaç¨åºæ¶ï¼éè¦åæ¶æ¶åå°è¿åç§æ¹é¢ã使ç¨æåç¼è¾è½¯ä»¶ï¼ä¾å¦è®°äºæ¬ãååæ¿ãUltraEditçï¼æéæå¼åç¯å¢ï¼EclipseãMyEclipseçï¼å¨Javaæºæ件ä¸å®ä¹ä¸åçç±» ï¼éè¿è°ç¨ç±»ï¼è¿äºç±»å®ç°äºJava APIï¼ä¸çæ¹æ³æ¥è®¿é®èµæºç³»ç»ï¼ææºæ件ç¼è¯çæä¸ç§äºè¿å¶ä¸é´ç ï¼åå¨å¨classæ件ä¸ï¼ç¶ååéè¿è¿è¡ä¸æä½ç³»ç»å¹³å°ç¯å¢ç¸å¯¹åºçJavaèææºæ¥è¿è¡classæ件ï¼æ§è¡ç¼è¯äº§ççåèç ï¼è°ç¨classæ件ä¸å®ç°çæ¹æ³æ¥æ»¡è¶³ç¨åºçJava APIè°ç¨ ã
Java判断Integer相等-应该这么这样用
在项目中使用Java的`==`操作符比较`Integer`类型时,很容易掉进陷阱。让我们深入解析这个问题,理解为什么结果不一致。
首先,当执行`Integer i1 = `时,底层会自动进行装箱,将`int`类型转换为`Integer`对象。
接着,我们观察到`==`操作符会判断两个对象在内存中的地址是否相等。因此,`System.out.println(i1 == i2);` 和 `System.out.println(i3 == i4);` 实际上是在判断它们在内存中的地址是否相同。
根据直觉,许多人会以为结果要么全是`true`,要么全是`false`,但实际上并非如此。问题的关键在于`Integer`类的内部实现。
源码显示,当创建的`Integer`对象的值在`-`到``之间时,会从`IntegerCache`类中直接返回已存在的对象,而不会创建新的对象。只有当数值大于``时,才会调用`new Integer`方法创建新的对象。
因此,对于正整数`Integer > `,它们会创建新的对象,导致比较结果为`false`;而对于小于等于``的数值,它们会从`Cache`中获取到同一个对象,导致比较结果为`true`。
总结来说,使用`==`操作符比较`Integer`类型时,结果取决于它们在`Cache`中的状态。为确保比较的准确性,建议使用`equals`方法进行比较。
类似地,`Byte`、`Short`、`Long`等类型也有类似的`Cache`机制,建议翻阅源码以深入了解。
希望本文的分析能帮助你更好地理解`Integer`比较的问题。记住,使用`equals`方法进行比较可以避免因`Cache`机制而导致的意外结果。