《深入分析Java Web技术内幕》深入之后的理解

简介: ## 0.前言 近期阅读了《深入分析Java Web技术内幕》这本书,书中涉及的知识点非常全面,让我对Java Web相关技术有了更加全面的认识,受益匪浅。这里跟大家分享下本人深入后印象比较深刻的几个点。 ## 1.NIO (Non-blocking IO) ### 1.1同步异步、阻塞非阻塞 - I/O交互中经常涉及同步/异步,阻塞/非阻塞。 - 要注意这两个是不同纬度

0.前言

近期阅读了《深入分析Java Web技术内幕》这本书,书中涉及的知识点非常全面,让我对Java Web相关技术有了更加全面的认识,受益匪浅。这里跟大家分享下本人深入后印象比较深刻的几个点。

1.NIO (Non-blocking IO)

1.1同步异步、阻塞非阻塞

  • I/O交互中经常涉及同步/异步,阻塞/非阻塞。
  • 要注意这两个是不同纬度的概念:同步/异步指的是程序跟I/O操作的关系,如果由程序自己控制I/O操作则是同步,如果将I/O操作委托给其他(例如操作系统),则是异步;阻塞/非阻塞指的是I/O操作时对于CPU的消耗,如果CPU停下来等待I/O操作完,再进行其他操作,则为阻塞,否则是非阻塞。
  • 根据组合,I/O交互可分为同步阻塞、同步非阻塞、异步阻塞、异步非阻塞四种。其中BIO为同步阻塞的,NIO为同步非阻塞,而AIO(也称为NIO2,书中没有讲到AIO)是异步非阻塞的。

1.2NIO的核心

NIO最主要的三个概念Channel、Buffer、Selector。

Channel

首先看下jdk里对于Channel的注释
image.png

  • Channel代表了一个可以用来进行至少一种直接IO操作(例如读、写)的实体(例如硬盘、文件、socket等);
  • 不同于InputStream或者OutPutStream,Channel是双向的,它可以代表不止一种IO操作;
  • Channel的数据可以异步读写;
Buffer

Channel的数据不能直接写入或者读取,需要使用Buffer。
image.png
Buffer就是一段连续并拥有特定大小的原始类型数据载体。它拥有三个关键的指针来标记当前的读取数据状态,分别是position, limit, capacity。其中,capacity标识了当前Buffer的总容量。limit则标识了在读/写模式下,还能再读/写到的位置。position则代表了当前数据的位置。

初始时如下图:
image.png

当读取5个字节后,则变为下面的状态:
image.png

此时,调用flip()的方法,则会转换Buffer的读写状态,有写入变为读取,此时的指针变为下面的状态:
image.png
此时就可以使用get()读取Buffer中的数据,读取完调用clear()方法,状态则会再次重置为初始状态。

Selector

image.png
NIO的神奇之处就在于Selector。多个SelectableChannel可以都注册到同一个Selector上,每个注册后都有一个SelectionKey,这个SelectionKey可以检测到Channel的状态,是在请求链接,还是数据准备好了,还是断开连接,根据不同的状态做出不同的操作。这样就可以使用较少的线程来管理更多的连接,同时I/O操作可以是非阻塞的,提高了系统中的吞吐量。

1.3对比BIO、AIO

前面已经提过,BIO为同步阻塞的,NIO为同步非阻塞,而AIO(也称为NIO2)是异步非阻塞的。

  • BIO是同步阻塞的,IO时会造成cpu等待,当拥有大量连接请求时,IO将会成功系统吞吐量的瓶颈。
  • NIO因为是非阻塞的,所以在IO还没有准备好时,cpu可以去做别的事情,而不是停下来等待,系统吞吐量增加;
  • AIO则通过异步通道实现异步非阻塞IO,当进行读/写操作时,调用API的read或者write方法即可,IO的准备以及读/写数据均有操作系统完成,当操作系统完成后,将结果通知应用程序。

2.Servlet

2.1 Servlet容器

  • Servlet创建,初始化,运行等均离不开Servlet容器,比较流行的Servlet容器有Tomcat,Jetty等。

image.png
image.png
Tomcat作为一个Web容器,其设计大而全。Jetty基于Handler的设计更加轻盈,在定制化和移动领域有不错的表现。

2.2 Servlet创建与初始化

StandardContext会根据我们的配置解析servlet,并设置属性、mapping等,同时根据load-on-startup属性判断是否立即初始化。
image.png

2.3 Servlet体系结构

Servlet引用了几个关键的类,ServletContext,ServletConfig,ServletRequest,ServletResponse。ServletConfig包含了一些配置属性,ServletRequest和ServletResponse分别代表了请求和返回,ServletContext代表了应用的上下文信息,可读取全局的存储信息。

image.png

3.Spring

3.1 Spring架构

Spring的架构大家都比较熟悉了
image.png
这里面最核心的就是Core,Context,Bean,而最最核心的就是Bean了。

3.2 Bean

Bean组件主要包含了Bean的创建,Bean的定义,Bean的解析。

Bean的创建使用了经典的工厂方法模式
image.png

我们定义的Bean在Spring内部都会转化成BeanDefinition
image.png

image.png

关于Spring的内容这里就不再展开讲了,后面有机会单独拿出来分享。

4.设计模式

本书里面很多章节都讲到了涉及的设计模式。比如IO的装饰者模式和适配器模式,Tomcat的观察者模式、命令模式、外观模式,Spring的策略模式,模板方法模式,iBatis的工厂模式等等。

5.写在最后

这本书涉及的东西很多,看出来君山想要讲的东西很多,但限于篇幅,有些都是点到为止,所以对于部分技术的一些细节,还需要自己继续去深挖一下,一定会有更大的收获。

相关文章
|
16天前
|
Java Maven Spring
Java Web 应用中,资源文件的位置和加载方式
在Java Web应用中,资源文件如配置文件、静态文件等通常放置在特定目录下,如WEB-INF或classes。通过类加载器或Servlet上下文路径可实现资源的加载与访问。正确管理资源位置与加载方式对应用的稳定性和可维护性至关重要。
|
19天前
|
存储 安全 搜索推荐
理解Session和Cookie:Java Web开发中的用户状态管理
理解Session和Cookie:Java Web开发中的用户状态管理
40 4
|
18天前
|
Java 持续交付 项目管理
使用Maven进行项目管理:提高Java Web开发的效率
Maven 是一款强大的项目管理和构建自动化工具,广泛应用于Java社区。它通过依赖管理、构建生命周期管理、插件机制和多模块项目支持等功能,简化了项目的构建过程,提高了开发效率。本文将介绍Maven的核心功能及其在Java Web开发中的应用。
37 0
WK
|
24天前
|
安全 Java 编译器
C++和Java哪个更适合开发web网站
在Web开发领域,C++和Java各具优势。C++以其高性能、低级控制和跨平台性著称,适用于需要高吞吐量和低延迟的场景,如实时交易系统和在线游戏服务器。Java则凭借其跨平台性、丰富的生态系统和强大的安全性,广泛应用于企业级Web开发,如企业管理系统和电子商务平台。选择时需根据项目需求和技术储备综合考虑。
WK
38 0
|
1月前
|
前端开发 Java API
JAVA Web 服务及底层框架原理
【10月更文挑战第1天】Java Web 服务是基于 Java 编程语言用于开发分布式网络应用程序的一种技术。它通常运行在 Web 服务器上,并通过 HTTP 协议与客户端进行通信。
26 1
|
2月前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
34 1
|
3月前
|
前端开发 JavaScript Java
Ajax进行异步交互:提升Java Web应用的用户体验
Ajax 技术允许在不重载整个页面的情况下与服务器异步交换数据,通过局部更新页面内容,极大提升了 Java Web 应用的响应速度和用户体验。本文介绍 Ajax 的基本原理及其实现方式,包括使用 XMLHttpRequest 对象发送请求、处理响应数据,并在 Java Web 应用中集成 Ajax。此外,还探讨了 Ajax 如何通过减少页面刷新、实时数据更新等功能改善用户体验。
73 3
|
3月前
|
Java Docker 微服务
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
微服务架构的概念、特点以及如何在Java Web开发中实现微服务。
97 1
|
3月前
|
存储 安全 搜索推荐
深入探讨Session和Cookie的概念、用途以及如何在Java Web开发中有效地使用它们进行用户状态管理。
在Java Web开发中,Session和Cookie是管理用户状态的核心技术。Session存储于服务器端,通过唯一的Session ID识别用户,确保数据安全与隐私;Cookie则存储于客户端,用于记录用户偏好等信息。两者各有优势:Session适合存储敏感数据,但需合理管理避免资源浪费;Cookie便于持久化存储,但在安全性上需谨慎设置。开发者可通过Servlet API轻松操作二者,实现个性化用户体验与应用性能优化。
60 2
下一篇
无影云桌面