《深入分析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.写在最后

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

相关文章
|
22天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
1天前
|
设计模式 存储 前端开发
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
Java从入门到精通:2.2.1学习Java Web开发,了解Servlet和JSP技术,掌握MVC设计模式
|
10天前
|
Web App开发 Java 应用服务中间件
【Java Web】在 IDEA 中部署 Tomcat
【Java Web】在 IDEA 中部署 Tomcat
|
19天前
|
安全 前端开发 Java
Java Web开发知识点学习总结
Java Web开发涉及Java基础、Servlet、JSP、数据库操作(SQL+JDBC)、MVC设计模式、Spring框架、Hibernate ORM、Web服务(SOAP&RESTful)、安全认证(HTTP Basic/Digest/OAuth)及性能优化(缓存、异步、负载均衡)。
18 3
|
22天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
23天前
|
前端开发 安全 Java
使用Java Web框架:Spring MVC的全面指南
【4月更文挑战第3天】Spring MVC是Spring框架的一部分,用于构建高效、模块化的Web应用。它基于MVC模式,支持多种视图技术。核心概念包括DispatcherServlet(前端控制器)、HandlerMapping(请求映射)、Controller(处理请求)、ViewResolver(视图解析)和ModelAndView(模型和视图容器)。开发流程涉及配置DispatcherServlet、定义Controller、创建View、处理数据、绑定模型和异常处理。
使用Java Web框架:Spring MVC的全面指南
|
24天前
|
Java
销售业务管理系统【Web系统】(Java课设)
销售业务管理系统【Web系统】(Java课设)
13 5
|
1月前
|
Java Maven
Maven【2】( Web 工程依赖 Java 工程)(命令行操作)
Maven【2】( Web 工程依赖 Java 工程)(命令行操作)
20 0
|
1月前
|
Java 数据库连接 数据库
JAVA Web项目开发SSM框架搭建(第一天)
JAVA Web项目开发SSM框架搭建(第一天)
|
1月前
|
Java Maven Android开发
JAVA Web项目开发创建Web项目(第一天)
JAVA Web项目开发创建Web项目(第一天)