Spring boot之maven聚合项目整合ssm实现多模块
文章目录前言需求分析环境搭建整合及测试前言1.首先讲讲为什么需要聚合?首先聚合工程是模块化开发的标志,也是微服务工程的一个前提,把服务或者具体模块拆分,在当下的开发中,结构变得很清晰,我们设计的工程会有明显的模块区分,如通用模块啊,一些系统服务模块啊,还有一些扩展功能模块啊,聚合工程的优势就是在于扩展性高,加功能新建model然后通过pom依赖实现依赖传递,降低耦合度。2.第二讲讲为什么要写这篇博
前言
1.首先讲讲为什么需要聚合?
首先聚合工程是模块化开发的标志,也是微服务工程的一个前提,把服务或者具体业务拆分,在当下的开发中,结构变得很清晰,我们设计的工程会有明显的模块区分,如通用模块啊,一些系统服务模块啊,还有一些扩展功能模块啊,聚合工程的优势就是在于扩展性高,加功能新建model然后通过pom依赖实现依赖传递,降低耦合度。
2.第二讲讲为什么要写这篇博客
写这篇博客的原因是记录学习,因为最近在学习一些开源项目的管理系统项目,如若依,el-admin等等,他们的项目都是以聚合工程的形式,此前在玩转SpringMVC系列也有一篇整合文章,那篇是传统的WEB项目,并不是整合Spring boot的Spring web项目,同时Spring boot的maven聚合这一块的文章参差不齐,而且很多都是只有贴代码或者是照着培训资料的演示,就也是将三层拆开,每个层分成一个模块,没有说明,容易让初学者认为好像似乎聚合工程就是这样拆,也只能这样子一样。这次我打算演示整合的不是这种做法的。
需求分析
本案例将web层从垂直架构里抽离出来,把模型层做为单独一层,为什么这样做,是为了让学习者知道,开发中还可以这样拆,我可以模块增减我的工程,可以前端页面做一个模块,后端数据或者通用代码可以单独放一个模块。
顺道说说我对将ssm三层拆开的聚合的理解是,这样拆的原因是可以让系统更细致化,粒度更细,可灵活根据系统各层服务压力,在部署层面做处理,可以适当的增减集群。更具伸缩性。
环境搭建
首先,做过聚合项目的都知道,我们需要首先建立一个父工程,而父工程的src文件夹是可以删除的,其他都在此工程的基础上新建模块。值得了解的是模块是可以独立运行的,模块之间是一种弱关联,而父子之间,以及子与子之间通过maven的项目管理依赖传递的特性实现了这种弱关联。正如我们这个工程是吃一顿饭,它可以用到筷子,也可以勺子,筷子和勺子是可以独立使用的,也可以一起使用,在这吃这顿饭的时候,他们形成了弱关联。
ok,创建springboot项目的时候比起以往创建父工程便捷,在于我们创父工程的时候可以选择只创建pom,这样父工程就完成它的历史使命了,就是作为一个存放目录以及作为基础依赖,而本案例就不写版本锁定了,我们直接使用的是依赖spring-boot-starter-parent
,只要子工程中的spring boot版本选择的和父的一致,出现处突的现象也很少,而且会简单一点,毕竟本案例是展示整合使用,和架构拆分以及如何单元测试,而不是一味讲maven。
父工程--polymer_springboot
|--polymer_model
|--polymer_web
当然必不可少mysql啊,还有相关视图工具,数据先准备如下:
那接下来就开始吧:首先使用脚手架搭建
也提一下版本锁定在哪吧。
polymer_springboot的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.tho</groupId>
<artifactId>polymer_springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>polymer_springboot</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
接下来建立子模块:
先创的是web模块,一样是用脚手架建的springboot项目,因为我们打算使用web作为程序入口,而数据业务作为一个单独的模块,当然可以创maven工程再去补充而且要自己动手创建启动器以及启动方法,这样慢一点,我此前的博客里有直接使用maven创springboot工程。ok演示:
polymer_web的pom.xml
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.tho</groupId>
<artifactId>polymer_web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>polymer_web</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
而polymer_web则直接maven普通java项目:
整合及测试
User
public class User{
private Integer id;
private String username;
private String password;
private String realname;
//省略getter,setter,toString
}
UserMapper
@Repository
@Mapper
public interface UserMapper {
@Select("select * from user where id=#{id}")
public User selectUserById(int id);
}
ok,首先我们确定我们写的mybatis语句没错,其次父工程已经有了mybatis的整合启动器,那么接下来怎么测试呢?我们可以让web包依赖我们这个项目实现依赖传递,我们的模型数据就可以直接注入web中的spring容器了,而且可以在集成spring的测试环境中测试!
但是首先还是记得配置数据库连接配置!
spring.datasource.url = jdbc:mysql://localhost:3306/mybatis_springboot?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
spring.datasource.username = root
spring.datasource.password = root3306
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
然后model模块配置打包成jar包(默认jar,最好还是手动加,省的有奇奇怪怪的问题),再给web模块依赖
@Autowired
private UserMapper userMapper;
@Test
public void testMapper(){
User user = userMapper.selectUserById(1);
System.out.println(user);
}
当然因为是使用脚手架创建的,一般没有太大问题,当然值得注意是启动类的位置和测试启动类的位置。
测试:
证明mybatis和spring整合是没问题的,而且能web这个模块的springboot中测试运行。
在model层编写:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserMapper userMapper;
@Override
public User selectUserById(int id) {
return userMapper.selectUserById(id);
}
}
@Service
public interface UserService {
public User selectUserById(int id);
}
在web中测试:
接下来编写控制层完成ssm整合,最官方当然是写个helloController测试,但是没必要,因为都是spring家族,所以直接上我们要的写的吧。
在web的com.tho下创建controller层代码如下
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/get/{id}")
@ResponseBody
public String GetUser(@PathVariable("id") int id){
return userService.selectUserById(id).toString();
}
}
接下来测试:
有两种测试方法,一种还是编写测试类,注入Controller:
@Autowired
private UserController userController;
@Test
public void testController(){
String s = userController.GetUser(1);
System.out.println(s);
}
至此已经整合成功啦。当然为了更明显可以在代码里面每一层加入输出语句说哪一层执行了。
值得注意的是Service的注解接口不一定要加@Service,但是如果实现类不加了运行不了的。
回顾一下整合一些需要:
首先父工程需要是springboot工程,我们父工程一般都不写代码,所以有一层必须承担起这个作为spring boot的启动入口的职责,通过通过模块的依赖,完成传递属性等,通过注解申明了各层是spring组件,通过spring boot自动装配配置进一个容器里。然后各层传递,从而实现从前端请求到获取数据库数据,再到响应数据库数据这个过程。
更多推荐
所有评论(0)