JavaWeb编年史(黄金时代)1

简介: 从JavaWeb编年史的远古时代,一直到白银时代,我们见证了JavaWeb开发模式的大致变迁。说白了,就是不断解耦合的过程。接下来我们来聊聊项目架构的演变,之所以我把它划到了JavaWeb编年史(黄金时代),是因为在早期的JavaWeb项目中,很少有架构的概念,基本就是一个单体项目,然后不断在已有项目上堆砌新的功能。所以,当我们开始有了架构的概念,其实也是一种非常大的进步,我个人称之为黄金时代,哈哈。

从JavaWeb编年史的远古时代,一直到白银时代,我们见证了JavaWeb开发模式的大致变迁。说白了,就是不断解耦合的过程。接下来我们来聊聊项目架构的演变,之所以我把它划到了JavaWeb编年史(黄金时代),是因为在早期的JavaWeb项目中,很少有架构的概念,基本就是一个单体项目,然后不断在已有项目上堆砌新的功能。所以,当我们开始有了架构的概念,其实也是一种非常大的进步,我个人称之为黄金时代,哈哈。


对于小公司来说,大部分项目都比较小,交给一个人开发足以,使用单体项目也无所谓。但是,随着互联网的发展,项目的功能越来越多,就得考虑把项目进行拆分,从而进一步解耦。


JavaWeb编年史 - 黄金时代,就是架构不断升级的年代,各种新的思想层出不穷,但是目的只有一个:拆分项目,进一步解耦。(其实也并没有特别严谨的时间顺序啦,如此行文只是为了统一下文章风格哈)


模块化时代


在解释模块化之前,我们先回顾一下,面向对象的三大特性是什么?


哦,聪明的你肯定立刻就想到继承、封装和多态。面向对象使得Java代码能够轻易被复用,Java程序变得更加灵活。


现在,我们把宾语换成Java项目,就变成了:面向对象使得Java项目能够轻易被复用,Java程序变得更加灵活。


是啊,如果受体变成项目,项目之间也去实现继承,那么很多功能就可以得到复用。而maven可以通过聚合工程,来实现这一点,这个功能是maven本来就具备的。那么,只要我们是用maven来搭建项目,就可以实现真正的模块化开发。


回想一下上一节的springboot项目,结构是这样的:


a9d08ac5c475c3a1bf3c1089f65815a2.png


项目根据package来进行模块划分,看似没有问题,但是非常不好维护。


主要体现在:


1.如果其他项目有类似的功能,则需要每一个项目都写重复的代码,比如xxxService、xxxDao等。


2.团队协作的时候,不管你是用SVN还是git,都有极大概率多人操作同一个类,不利于版本管理。


3.项目如果体量越来越大,则文件会越来越多,整体会变得臃肿。


因此,需要用模块化的方法将这些package分化,简单来说就是把一个个package变成一个个module。


moudle叫做组件,或者叫子工程、子项目都可以。


2.演示将单体项目模块化

刚才那张图,我们需要将每一个package拆出来,做成一个module,最终项目结构就变成了这样:

f20e8ee8de7904b1a2b419b0cade5ec8.png

下面我们依次来介绍各个模块的作用。

web-api

这个是接口模块,主要是提供服务给外界,对应于之前的controller层

1b36ba7f5578254b9c5a9835ed9a316e.png

因为是前后端一体的项目,这边继续保留webapp。如果做的是前后端分离项目,则不需要webapp。

注意,启动配置这边要填写这个,否则访问不了JSP页面。

7950e3c89b8cd81dc50b19029ea709b9.png

然后webapp的目录要进行如下配置,否则也是访问不了页面的。

2d44b3db348ea83315ab3bae0414ec92.png


web-api是整个工程的门面。

pom文件:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>web1</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>web-api</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>web-model</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>web-service</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

从pom中可以看到,web-api需要依赖web-service,web-model。

web-service

这是服务模块,为web-api提供服务支持,对应原来的service。

0af3bfdfa73ed880ec2d82bd69a43016.png

pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>web1</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>web-service</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>web-model</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>web-dao</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

从pom中可以看到,web-service需要依赖web-dao,web-model。

web-dao

这是数据访问模块,对应原来的dao。

bd7b5cd96705726f80f3ef4c7737a8ff.png


pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>web1</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>web-dao</artifactId>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>web-model</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>

从pom中可以看到,web-dao需要依赖web-model。

web-common

这是公共模块,主要放置一些工具包和类库,因为项目只是演示,所以目前这是一个空模块。

父项目

父项目就是这个web7,其余5个模块都是在这个项目里面的。


1aa6ea34517a3c014c3c3cf9a1d5ed5f.png

体现在pom文件,就是

<modules>
  <module>web-common</module>
  <module>web-api</module>
  <module>web-dao</module>
  <module>web-model</module>
  <module>web-service</module>
</modules>

然后每一个模块的pom中都有一个parent

<parent>
    <artifactId>web1</artifactId>
    <groupId>org.example</groupId>
    <version>1.0-SNAPSHOT</version>
</parent>

也就是说,那5个模块都是父项目的子项目,继承自父项目。

打包方式:

<packaging>pom</packaging>

还有,顶层的父项目的打包方式必须为pom,表明这是一个聚合工程。pom工程就像是一个公共类,给下面的子模块提供了maven依赖版本号,方便控制版本。其实也没有什么特别神秘的地方。


模块化的好处

我们一般所说的模块化,就是指的maven聚合项目。


聚合的意义

对于一个大型的项目,如果我们直接作为一个工程开发,由于相互之间的依赖我们只能从头到尾由一组人开发,否则就会出现一个类好多人开发,相互更改的混乱局面,这个时候我们就将项目进行了横向和纵向的拆分。


所谓的横向的拆分就是我们平常说的三层架构,将项目分成了web层,service层、dao层(web层也被叫做表现层,service层也被叫做业务层,dao层也被持久层),可以理解为将一个功能模块的不同调用过程进行了水平方向的拆分。


所谓的纵向拆分就是将一个项目的多个功能模块进行了,可以理解为为了完成一个系统,深度(纵向)分析需要有哪些功能,然后将这些功能独立出来,进行了(纵向)拆分。


横向拆分后,每个功能模块进行了单独的开发之后,项目整合的时候就需要有一个能够整合这些项目或者模块的工程,这就是所谓聚合工程的意义。


相关文章
|
1天前
|
Web App开发 SQL Java
javaweb实现分页(二)
javaweb实现分页(二)
20 1
|
1天前
|
JSON Java 应用服务中间件
JavaWeb项目之乱码问题及如何解决
JavaWeb项目之乱码问题及如何解决
|
1天前
|
Java 程序员 应用服务中间件
JavaWeb之过滤器(Filter)与监听器(Listener)
本文介绍了JavaWeb中的过滤器(Filter)和监听器(Listener)概念及其使用。过滤器主要用于拦截和处理Web资源请求,如进行编码设置、权限验证等,它在Servlet之前和之后执行。监听器则监听域对象(如ServletRequest、HttpSession、ServletContext)状态变化,分为创建/销毁监听和属性变化监听。监听器在Web.xml中注册后会在相应事件发生时自动执行,例如用于统计网站访问人数或初始化配置。
|
1天前
|
JavaScript 前端开发
javaweb文件上传和下载
javaweb文件上传和下载
|
1天前
|
前端开发 NoSQL 应用服务中间件
javaweb单点登录的三种实现方式
javaweb单点登录的三种实现方式
41 0
|
1天前
|
SQL 前端开发 Java
Java后端进阶之路: JavaWeb(四)
Java后端进阶之路: JavaWeb
35 1
|
1天前
|
XML SQL Java
Java后端进阶之路: JavaWeb(三)
Java后端进阶之路: JavaWeb
35 1
|
1天前
|
安全 Java 调度
深入理解Java并发编程:线程安全与性能优化
【5月更文挑战第12天】 在现代软件开发中,多线程编程是提升应用程序性能和响应能力的关键手段之一。特别是在Java语言中,由于其内置的跨平台线程支持,开发者可以轻松地创建和管理线程。然而,随之而来的并发问题也不容小觑。本文将探讨Java并发编程的核心概念,包括线程安全策略、锁机制以及性能优化技巧。通过实例分析与性能比较,我们旨在为读者提供一套既确保线程安全又兼顾性能的编程指导。
|
1天前
|
Java 程序员 调度
Java中的多线程编程:从理论到实践
【5月更文挑战第14天】在现代计算机技术中,多线程编程是一个重要的概念。它允许多个线程并行执行,从而提高程序的运行效率。本文将从理论和实践两个角度深入探讨Java中的多线程编程,包括线程的基本概念、创建和控制线程的方法,以及如何处理线程同步和通信问题。
|
1天前
|
Java
Java中的多线程编程:基础知识与实践
【5月更文挑战第13天】在计算机科学中,多线程是一种使得程序可以同时执行多个任务的技术。在Java语言中,多线程的实现主要依赖于java.lang.Thread类和java.lang.Runnable接口。本文将深入探讨Java中的多线程编程,包括其基本概念、实现方法以及一些常见的问题和解决方案。