本文次要梳理 Java 后端开发中的外围概念,帮忙从顶层了解整个后端技术体系
@author Frankir
要想彻底了解明天各种顶层框架技术的作用和相互之间的关联及区别,咱们须要从最原始的 JavaWeb 开发技术开始梳理。
1. servlet+jsp+html+css+js 的时代
在这个阶段,程序员依据 JavaEE-Servlet 标准,编写解决前端申请的 servlet,在 servlet 中编写 service()办法,处理器申请返回响应。
以最经典的 Tomcat 作为 Http 服务器和 Servlet 容器的形式为例,首先咱们须要晓得如果仅仅有 Http 服务的性能,不编写 servlet,咱们能够应用相似 Ngnix 这样不带 Servlet 容器的服务器来做,这样浏览器其实是能够通过 url 申请获取到服务器上的动态资源的。比方 https://blog.csdn.net/silence_xiang/article/details/103277852 获取文章。
然而如果心愿 Web 服务器能过依据咱们的输出返回响应的内容,比方在表单中提交数据查问后端数据库上满足条件的数据记录,就须要引入 Web 容器 /Servlet 容器,由 Servlet 负责承受申请和返回响应。
Http 服务器和 Servlet 容器的性能界线是:Http 就像是前台,负责网络通信和申请的解析,而 Servlet 容器是业务部门,负责解决业务申请。(如果只是动态资源,那还解决什么呢,间接返回就好了)。留神,在 Tomcat 的实现中,申请动态资源其实是会应用一个默认的 Servlet 实现的。
有了 Servlet 容器,配置好 web.xml 文件,批示什么样的 url 该当由哪个 servlet 解决,最后的 Web 性能就能够实现。
起先,程序员间接在 servlet 代码外面内嵌 html 代码,返回给浏览器解析,这样做导致 servlet 代码极其简单。同时咱们也晓得 html 是无奈表白动静的数据内容的。为了解决这个问题,引入了 Jsp 技术。Jsp 其实就是一种 Servlet,只不过看起来就像 html 那样。一个显著的区别是,一个 html 能够间接在浏览器关上,而 Jsp 不行,因为它是一个 Servlet,须要通过 java 程序的翻译,能力被浏览器解析。好了,到此为止,咱们就能够应用 servlet+jsp(+html+css+js)实现 web 开发了。
2. 晚期其余技术的演变
在 servlet+jsp 开发模式下,JavaEE 的经典三层架构是 web 层 +service 层 +DAO 层。web 层承受用户申请,调用 service 层实现业务,返回响应。service 层实现各种业务解决,提供各种业务 API 给 web 层应用。DAO 层实现与数据库相干的操作。这个时候为了将 web 层的工作拆分成组件,升高代码的耦合度。引入了 MVC 的设计模式。
- View 视图层:只负责数据和界面的显示,不承受和显示数据无关的代码,便于程序员和美工的分工合作。(Vue/Jsp/Thymeleaf/Html)
- Controller 控制器:只负责接管申请,调用业务层的代码解决申请,而后派发页面,是一个调度者的角色。(Servlet)
- Model 模型:将与业务逻辑相干的数据封装成具体的 JavaBean 类,其中不掺杂任何与数据处理相干的代码(JavaBean/Domain/Pojo)Model 是由 Service 调用的。
同期间前端呈现了 jquery 开发库,简化 js 的编码。在 DAO 层,为了简化 java 程序和数据库的交互,呈现了 Jdbc-DBUtils 数据库连接池和用于将数据表中的记录封装成 JavaBean 的工具包。
3. Spring 框架 SpringMVC MyBatis
在传统的 OOP 面向对象的开发方式中,程序员编写程序,在程序中读取配置信息,创建对象,应用对象实现工作。程序中大量的获取对象的操作其实是和业务逻辑不太相干的。Spring 是一个容器框架,它依据注解或者 xml 配置文件,创建对象,并放入到 IOC 容器中,并且能够解决对象之间简单的依赖关系。当程序员须要应用某个对象 (比方 userAction) 时,就间接从容器中获取,这样就能够更加关注如何应用对象实现相应的业务。
要了解 AOP 就先要了解动静代理机制,一句话总结就是:创立指标对象的代理对象,通过代理对象调用指标对象的指标办法实现目标办法的性能加强。AOP 是基于反射 + 动静代理的,其外围就是应用切面类,将切面类的告诉办法切入到指标办法的几个横切关注点的地位上,实现对立的切面编程。
Spring 框架的内含很多,上面是 Spring5.x 的架构图
能够分明的看到,IOC 容器是 Spring 治理 Beans 的外围。SpringMVC(Web+WebMVC)是基于 Spring 容器的 MVC 设计模式 web 开发框架。除此之外,Spring 还提供了 JDBCTemplate 简化数据库拜访,@Transactional 事务管理,@ExceptionHandler 异样解决等组件。
MyBatis 是三层构造中长久层的框架技术。次要是将 sql 语句从 java 源码中剥离到 xml 配置文件中,程序是以 OOP 的形式来操作 DB 的,而不再是之前面向数据表中行记录的数学思维,这样做代码的耦合度进一步升高。同时还能够通过配置缓存等形式优化数据库拜访,减小数据库的压力。
4. Spring 容器和 Servlet 容器
后面提到,Tomcat 作为 Web 服务器和 Servlet 容器的联合,能够承受网络 http 申请,解析为合乎 Servlet 标准的申请对象和响应对象。比方,HttpServletRequest 对象是 Tomcat 提供的,Servlet 是 JavaEE 标准,Tomcat 是实现这一标准的 Servlet 容器。
而 SpringMVC 其实就是 web 层解决 Servlet 申请的一个利用框架,他是基于 Spring 容器和 Servlet 的。咱们晓得地方控制器 DispatcherServlet 是 SpringMVC 中解决申请的外围,而它实质上就是一个 Servlet(实现了 Servlet 接口),是 Tomcat 这个 [Web 服务器 +Servlet 容器] 加载和调用的 DispatcherServlet。
DispatcherServlet 也有本人的容器 (基于 Spring 容器),通常能够称它为 SpringMVC 容器。这个容器负责的是和 SpringMVC 也就是 Web 层相干的 bean,比方 @Controller(Handler) 和视图解析器等。同时 Spring 中还有其余的 bean,如 Service 层的 @Service、DAO 层的 @Repository、其余组件 @Component 等等,这些是由全局的 IOC 容器治理的,即能够了解成 Spring 有两个 IOC 容器。
如果只是应用 Spring 容器治理 bean,不应用 SpringMVC 作为 web 层的开发框架,那么 Tomcat(Servlet 容器):先解析 web.xml 文件 (servlet-class、servlet-mapping),通过 Spring 提供的 IOC 容器获取对应的 servlet 对象,当 url-pattern 产生匹配的时候触发对应的代码逻辑,实质上还是 Tomcat 间接负责 http 报文的解析(这是它作为 Http 服务器应该干的) 和 servlet 调度的工作(这是它作为 Servlet 容器应该干的)。此时 Spring 容器只是简化了 Bean 的治理和获取、提供相似 JdbcDataAccess 更不便的一些操作。
如果应用 SpringMVC 作为 web 层的开发框架,那么 Tomcat 只是解析 http 报文,而后间接转交给 DispatcherServlet,上面由 SpringMVC 接管,依据注解、配置实现相应的逻辑,而后将后果提交给 DispatcherServlet,最初转发给 Tomcat,Tomcat 构建好 http 响应报文后返回给浏览器。
理清这些关系之后,相似过滤器和拦截器有什么区别?web.xml 文件和 springDispatcherServlet-servlet.xml 文件有什么区别?这样的问题就很容器答复了
5. 更进一步
前面又呈现了 SpringBoot 简化 SSM 我的项目的配置,再有就是面对分布式,面对关系型数据库的缺点提出 Redis 等等都是更进一步的优化了。