前言

大型Java项目都需要根据项目功能进行工程的细化;
Maven项目多模块是用项目层次的划分,替代简单的包层次的划分,遵循了高内聚,低耦合的设计模式;
工程细化的思想:分Java文件——-》分包——-》分模块——-》分工程(微服务);
我们可以借助Maven实现Java项目的分模块化开发:
- 父工程和子模块之间的依赖会继承
- 管理模块之间的依赖关系
一、Maven基础(回顾)
回顾之前学过的maven基础知识;
1.maven作用
- 依赖管理:pom.xml添加依赖
- 一键构建:点击按钮完成项目构建

2.maven常用命令

clean: 删除target目录(清理上一次构建过程产生的临时文件)
compile:编译src/mian/java目录下的java文件为.class文件
test: 编译src/mian/test目录下的java文件为.class文件并运行
packaage:打包编译src/mian/包含java、resources、webapp目录
install: 包部署到本地仓库
deploy:包部署到私服
3.maven生命周期
每一个生命周期就是一系列命令的集合
清理:clean
默认:compile—>test—>pakage—>install-deploy
站点:site
4.maven仓库种类
本地仓库:开发者电脑
私服:公司内网服务器
远程/中央仓库:公网服务器
5.maven主要标签
groupId : com.itheima 公司域名倒写
artifactId : spring 项目名称
version : 1.0-SNAPSHOT SNAPSHOT(快照) 测试版本 、 RELEASE(发行) 稳定版本
packing : 打包方式有 jar包 java、 war: web、 pom: 父工程
二、分模块开发(理论)
当1个大型Java项目中,我们可以把1个项目拆分成多个子模块,借助maven给每个当前项目中各个子模块,产生1个唯一的GAV坐标;(拆分)
把当前项目/模块安装到本地仓库中;
多个子模块之间就可以通过Maven的dependency标签引入当前模块依赖的其他模块,以完成模块之间的相互调用 ; (聚合)
1.模块的拆分和聚合思想
1.1.拆分:将原来的一个项目拆分成各个子模块, 每个子模块都有自己的GAV坐标;
1.2.聚合:通过GAV坐标的形式,将各个模块组装在一起,完成一个项目的功能;
2.项目和子模块的关系
项目和子模块属于继承关系,在父工程中声明的依赖,子模块都可以使用;
[En]
The project and child modules belong to inheritance relationship, and all the dependencies declared in the parent project can be used by the child module.
2.子模块之间的关系
子模块和子模块之间默认情况下没有任何关系,但是可以通过GAV坐标建立依赖关系;
3.父子工厂搭建
把1个SSM项目拆分成 ssm-web———–>ssm-service———–> ssm-dao这3个子模块,建立依赖关系,完成模块之间功能调用;
3.1.创建父工程
删除父工程的src目录;

3.2.创建持久层模块
创建持久层模块-普通Java工程
3.3.创建业务层模块
创建业务层模块-普通Java工程
3.4.创建表示层模块
创建表示层模块-web工程
由于表示层需要和web页面交互,需要把表示层模块转换成1个web工程;
3.5.建立模块之间的依赖

编译阶段2个模块之间建立依赖:可以通过源码建立依赖;
运行阶段2个模块之间建立依赖:必须把依赖的模块部署(package)到本地仓库中,才能被依赖;
两个模块是否建立依赖成功,可以从maven的Dependencies中查看;
3.5.1.ssm-service和ssm-dao模建立依赖
<dependency> <groupId>com.zhanggengroupId> <artifactId>ssm-daoartifactId> <version>1.0-SNAPSHOTversion> dependency> dependencies>
3.5.2.ssm-web 和ssm-service模块建立依赖
<dependencies> <dependency> <groupId>com.zhanggengroupId> <artifactId>ssm-serviceartifactId> <version>1.0-SNAPSHOTversion> dependency> dependencies>
3.6.依赖关系梳理
在上面的工程中存在两套关系;
3.6.1.父子工程之间继承关系
当父工程中的引入了Junit依赖之后,父工程中所有子模块也会继承Junit依赖,都可以使用的Junit功能;
3.6.2.依赖关系传递
当ssm-web模块——-依赖——–>ssm-service模块——-依赖——–>ssm-dao模块时;
此时ssm-web模块也可以调用ssm-dao模块中的功能;
ssm-web模块的配置文件也会读取ssm-dao模块所需要的依赖;
package com.heima.behavior;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import javax.sql.DataSource;
//排除model模块传递的DataSource数据库依赖
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
@EnableDiscoveryClient
public class BehaviorApplication {
public static void main(String[] args) {
SpringApplication.run(BehaviorApplication.class, args);
}
}


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
class="com.alibaba.druid.pool.DruidDataSource">
class="org.mybatis.spring.SqlSessionFactoryBean">
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
applicationContext-dao.xml
1.4.测试


package com.zhanaggen;
import com.zhanggen.domain.Student;
import com.zhanggen.mapper.StudentMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext-dao.xml")
public class StudentMapperTest {
@Autowired
private StudentMapper studentMapper;
@Test
public void testFindAll() {
List studentList = studentMapper.findAll();
for (Student student : studentList) {
System.out.println(student);
}
}
}
StudentMapperTest.java
2.修改ssm-service模块
2.1.创建service层接口


package com.zhanggen.service;
import com.zhanggen.domain.Student;
import java.util.List;
public interface StudentService {
//查询所有
List findAll();
}
StudentService.interface
2.2. 创建service实现类


package com.zhanggen.service.impl;
import com.zhanggen.domain.Student;
import com.zhanggen.mapper.StudentMapper;
import com.zhanggen.service.StudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class StudentServiceImpl implements StudentService {
@Autowired
private StudentMapper studentMapper;
//查询所有
public List findAll() {
return studentMapper.findAll();
}
}
StudentServiceImpl.java
2.3. 添加配置文件


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
package="com.zhanggen">
expression="org.springframework.web.bind.annotation.RestController"/>
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
applicationContext-service.xml
2.4.测试
分模块开发的项目,spring容器启动之后,如何加载各个子模块下的配置文件?
监听器:监听到tomcat启动
classpath*:搜索的时候既要搜索当前项目,又要搜索当前项目依赖的jar包中的类路径
@ContextConfiguration(“classpath:applicationContext-.xml”)


package com.zhanggen;
import com.zhanggen.domain.Student;
import com.zhanggen.service.StudentService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;
@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration({"classpath:applicationContext-service.xml", "classpath:applicationContext-dao.xml"})
//classpath*:搜索的时候既要搜索当前项目,又要搜索当前项目依赖的jar包中的类路径
@ContextConfiguration("classpath*:applicationContext-*.xml")
public class StudentServiceTest {
@Autowired
private StudentService studentService;
@Test
public void testFindAll() {
List studentList = studentService.findAll();
for (Student student : studentList) {
System.out.println(student);
}
}
}
StudentServiceTest.java
3.修改ssm-web模块
3.1.创建controller层处理器


package com.zhanggen.controller;
import com.zhanggen.domain.Student;
import com.zhanggen.service.StudentService;
import com.zhanggen.vo.ResultInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class StudentController {
@Autowired
private StudentService studentService;
//查询所有
@GetMapping("/student")
public ResultInfo findAll() {
List studentList = studentService.findAll();
return ResultInfo.success(studentList);
}
}
StudentController.java
3.2.创建结果信息类
统一后端响应信息格式;


package com.zhanggen.controller;
import com.zhanggen.domain.Student;
import com.zhanggen.service.StudentService;
import com.zhanggen.vo.ResultInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
@RestController
public class StudentController {
@Autowired
private StudentService studentService;
//查询所有
@GetMapping("/student")
public ResultInfo findAll() {
List studentList = studentService.findAll();
return ResultInfo.success(studentList);
}
}
ResultInfo.java
3.3.添加springMVC配置


<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><span><</span><span>context:component-scan </span><span>base-package</span><span>="com.zhanggen.controller"</span><span>/></span> <span><</span><span>mvc:annotation-driven</span><span>/></span> <span><</span><span>mvc:resources </span><span>mapping</span><span>="/index.html"</span><span> location</span><span>="/"</span><span>/></span> <span><</span><span>mvc:resources </span><span>mapping</span><span>="/css/*"</span><span> location</span><span>="/css/"</span><span>/></span> <span><</span><span>mvc:resources </span><span>mapping</span><span>="/fonts/*"</span><span> location</span><span>="/fonts/"</span><span>/></span> <span><</span><span>mvc:resources </span><span>mapping</span><span>="/img/*"</span><span> location</span><span>="/img/"</span><span>/></span> <span><</span><span>mvc:resources </span><span>mapping</span><span>="/js/*"</span><span> location</span><span>="/js/"</span><span>/></span>
beans>spring-mvc.xml
3.4.配置web.xml
spring监听器:当Tomcat启动时自动装配当前项目下所有子模块下的配置文件,启动spring
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"><span><</span><span>context-param</span><span>></span> <span><</span><span>param-name</span><span>></span>contextConfigLocation<span><span>param-name</span><span>></span> <span><</span><span>param-value</span><span>></span>classpath*:applicationContext-*.xml<span><span>param-value</span><span>></span> <span><span>context-param</span><span>></span> <span><</span><span>listener</span><span>></span> <span><</span><span>listener-class</span><span>></span>org.springframework.web.context.ContextLoaderListener<span><span>listener-class</span><span>></span> <span><span>listener</span><span>></span> <span><</span><span>servlet</span><span>></span> <span><</span><span>servlet-name</span><span>></span>dispatcherServlet<span><span>servlet-name</span><span>></span> <span><</span><span>servlet-class</span><span>></span>org.springframework.web.servlet.DispatcherServlet<span><span>servlet-class</span><span>></span> <span><</span><span>init-param</span><span>></span> <span><</span><span>param-name</span><span>></span>contextConfigLocation<span><span>param-name</span><span>></span> <span><</span><span>param-value</span><span>></span>classpath:spring-mvc.xml<span><span>param-value</span><span>></span> <span><span>init-param</span><span>></span> <span><span>servlet</span><span>></span> <span><</span><span>servlet-mapping</span><span>></span> <span><</span><span>servlet-name</span><span>></span>dispatcherServlet<span><span>servlet-name</span><span>></span> <span><</span><span>url-pattern</span><span>></span>/<span><span>url-pattern</span><span>></span> <span><span>servlet-mapping</span><span>></span> <span><</span><span>filter</span><span>></span> <span><</span><span>filter-name</span><span>></span>characterEncodingFilter<span><span>filter-name</span><span>></span> <span><</span><span>filter-class</span><span>></span>org.springframework.web.filter.CharacterEncodingFilter<span><span>filter-class</span><span>></span> <span><</span><span>init-param</span><span>></span> <span><</span><span>param-name</span><span>></span>encoding<span><span>param-name</span><span>></span> <span><</span><span>param-value</span><span>></span>utf-8<span><span>param-value</span><span>></span> <span><span>init-param</span><span>></span> <span><span>filter</span><span>></span> <span><</span><span>filter-mapping</span><span>></span> <span><</span><span>filter-name</span><span>></span>characterEncodingFilter<span><span>filter-name</span><span>></span> <span><</span><span>url-pattern</span><span>></span>/*<span><span>url-pattern</span><span>></span> <span><span>filter-mapping</span><span>></span>
web-app>web.xml
4.项目部署和打包
分模块开发的项目,如何部署和打包?
4.1.项目部署
ssm项目需要部署时,只需要部署ssm项目下的ssm-web模块即可;
![]()
当ssm项目打包(package)之后ssm-web模块根据pom中声明的依赖的模块ssm-service、ssm-dao, 以jar包的形式打进war里面;
![]()
参考
Original: https://www.cnblogs.com/sss4/p/16309207.html
Author: Martin8866
Title: 分模块实现SSM框架整合
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/114510/
转载文章受原作者版权保护。转载请注明原作者出处!