回顾
知识目标
第一单元、父子工程
1、为什么使用父子工程?
1.1、痛点1:提高了代码的重用性
父控制器的存在就是为了去除重复,一个项目存在多个模块,可能由多个人开发,比如abc3个模块,3个模块都是基于spring的那么3个开发都需要引入spring的核心jar包,这样就引入了3份,但是使用父子工程,则只需要在父工程中引入了,则子工程自动继承。
1.2、痛点2:提高了模块的分离度
按照以往的创建项目方式,一个maven项目就是一个大工程,一开始还能进行简单的测试编译,但是随着项目的不断变大和复杂化,后期再做改动则可能牵一发而动全身。但是使用父子工程,每个模块都是独立的,他们通过父控制器聚合在一起,这样当你要改动一个模块的时候你改动的也只是这一个模块而已,并不会影响其他的模块。
2、什么是父子工程?
父子工程说白了就是利用Maven的继承,依赖传递性来为我们省略一些重复的配置,通常配置在父模块中,为子模块提供使用,这样可以做到一处声明,处处使用。
2.1、什么是继承
是为了消除重复,如果将dao、service、web分开创建独立的工程则每个工程的pom.xml文件中的内容存在重复,比如:设置编译版本、锁定spring的版本的等,可以将这些重复的配置提取出来在父工程的pom.xml中定义。
2.2、什么是聚合
项目开发通常是分组分模块开发,每个模块开发完成要运行整个工程需要将每个模块聚合在一起运行,比如:dao、service、web三个工程最终会打一个独立的war运行。
3、父子工程的应用
项目需求:使用maven父子工程完成登录并跳转到首页列表
3.1、创建父子工程
3.1.1、创建父工程
提示:父工程只需要pom.xml文件,要将src目录删除。
#### 3.1.2、在父工程中以module的形式创建domain层子模块
因为domain层不需要页面所以创建控制台项目即可
注意:要在父工程上右键创建模块
#### 3.1.3、在父工程中以module的形式创建dao层子模块
因为dao层不需要页面所以创建控制台项目即可
注意:要在父工程上右键创建模块
#### 3.1.4、在父工程中以module形式创建service层子模块
因为service层不需要页面所以创建控制台项目即可
注意:要在父工程上右键创建模块
#### 3.1.5、在父工程中以module形式建web层子模块
注意:web层中包含controller和页面,所以web层要创建maven web工程
创建成功后,父工程的pom.xml中会自动引用所有的子模块
### 3.2、建立继承和依赖关系
在开发中,service要调用dao中的数据,而web又要调用service的数据,且domain又要被其他三层所调用,他们之间的调用关系如下:web->service->dao->domain
但是现在四个子工程相互是没有任何关系的,没有关系就不能调用。我们应该将他们之间关联起来
提示:maven项目之间的引用是通过本地仓库中的jar包进行引用,所以引用前要先将对应的模块打成jar包到本地仓库
3.2.1、配置domain模块的打包方式为jar
<packaging>jar</packaging>
#### 3.2.2、在dao子模块的pom中添加domain子模块的引用关系
#### 3.2.3、在service子模块的pom中添加dao子模块的引用关系
#### 3.2.4、在web子模块的pom中添加service子模块的引用关系
注意:web子模块的打包方式为war包
注意:在maven父子工程中父子工程不用直接建立关系,继承关系是先天的不用建立依赖关系。 平级之间的直接引用叫依赖,依赖不是先天的,需求要后天建立
3.3、在父工程的pom中添加ssm所需坐标
将项目所需的公共坐标添加到父工程的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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.woniu</groupId>
<artifactId>maven-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<modules>
<module>maven-domain</module>
<module>maven-dao</module>
<module>maven-service</module>
<module>maven-web</module>
</modules>
<packaging>pom</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>5.3.6</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<!--aop坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<!--spring测试-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!--cglib-->
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.3.0</version>
</dependency>
<!--spring事务坐标-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
</dependencies>
<build>
<!--解决maven项目不加载静态资源文件-->
<resources>
<resource>
<directory>${basedir}/src/main/java</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
<resource>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
</project>
3.4、编写domain子模块代码
创建实体类,注意实体类要实现序列化接口Serializable
package cn.woniu.domain;
import java.io.Serializable;
import java.math.BigDecimal;
/**
* 用户实体类
*/
public class User implements Serializable {
private int id;
private String userName;
private String passwd;
//省略Getter和Setter
实体类编写完成后,由于需要被 其他模块引用所以要将实体类发布到本地仓库中
打包完成后本地仓库的cn/woniu目录下就会生成一个maven-domain.jar
### 3.5、编写dao子模块代码
3.5.1、配置数据库连接信息
jdbc.driverClassName=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/test_mybatis?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=Aa123123.