有天上飞的概念,就要有落地的实现java
- 概念十遍不如代码一遍,朋友,但愿你把文中全部的代码案例都敲一遍
- 先赞后看,养成习惯
SpringBoot 图文教程系列文章目录mysql
本文已经收录码云仓库: https://gitee.com/bingqilinpe...
本文涉及源码下载地址: https://gitee.com/bingqilinpe...
什么是多模块开发?如图所示,项目中每个包对应都是一个完整的项目,在IDEA中称之为模块,每个模块都有完整的项目结构:独立的pom文件,独立的配置文件,独立的编译文件输出模块等等。git
那么这样项目结构的项目是如何设计出来的呢?web
技术选型:面试
- SpringBoot
- MybatisPlus MybatisPlus教程见:SpringBoot图文教程11—今后不写mapper文件「SpringBoot集成MybatisPlus」
- Mysql
多模块开发效果图以下:
spring
![]()
父级工程能够用来统一管理全部项目的依赖,如图,若是在父级项目中有一个mysql依赖,那么全部继承这个父级项目的子项目中也会继承到mysql的依赖sql
1.建立一个Project数据库
2.对IDEA作一些项目基本的配置apache
3.写父级项目的pom文件mybatis
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> <!-- 配置SpringBoot的父级项目--> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.lby</groupId> <artifactId>multi-module-demo</artifactId> <version>1.0-SNAPSHOT</version> <!-- packaging 父级项目的类型是pom --> <packaging>pom</packaging> <!-- properties 定义pom的全局变量 通常用于定义依赖的版本号 --> <properties> <java.version>1.8</java.version> <!-- lombok-version 这个标签是自定义的能够随便写 本质上就是一个变量 --> <lombok-version>1.18.4</lombok-version> </properties> <dependencies> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <!-- 版本号经过$获取properties中定义的版本号--> <version>${lombok-version}</version> <scope>provided</scope> </dependency> </dependencies> <!-- dependencyManagement 在 dependencyManagement 中配置的依赖 只是一种声明 声明了版本号 不会被项目继承下来【相关的jar包不会被子项目下载到项目中】 子项目若是想要继承到dependencyManagement中的依赖 须要单独在配置 只不过子项目若是继承 dependencyManagement 中的依赖 能够不写版本号【子项目中依赖版本 按照父项目中dependencyManagement 中配置下载】 --> <dependencyManagement> <dependencies> <!--若是是Mybatis写成Mybatis便可--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.3.1.tmp</version> </dependency> <!--数据源--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.19</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency> </dependencies> </dependencyManagement> </project>
注意:
dependencies 和 DependencyManagement 的区别
DependencyManagement 只是声明依赖,并不实际引入,所以子项目须要显式声明须要用到的依赖
子项目开发的步骤以下:
- 基于Project建立module
- 修改pom
- 写配置,没有能够不写
- 写代码
1.基于Project建立module
建立完multi-entity后打开pom能够看到
![]()
此时打开父级项目的pom 会看到
2.修改pom
完整的multi-entity项目的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 --> <parent> <artifactId>multi-module-demo</artifactId> <groupId>com.lby</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>multi-entity</artifactId> <dependencies> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> </dependency> </dependencies> </project>
3.在项目中写入实体类
package com.lby.entity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; @TableName("cmfz_admin") @Data public class Admin { /** * 主键属性 @TableId * * value 该属性对应的数据库表中的字段名 * type 主键自增的类型 AUTO 表明自动递增 */ @TableId(value = "id",type = IdType.AUTO) private Integer id; /** * 非主键属性 @TableField * @TableField("username") 参数为该属性对应的数据库表中的字段名 * */ private String username; private String password; private String salt; }
对于dao模块而言,不一样的地方在于,在multi-dao中须要使用到 multi-entity中的实体类,可是怎么在dao模块中使用到另外一个项目中的实体类呢?
将multi-entity像依赖同样导入 multi-dao中
multi-dao完整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>multi-module-demo</artifactId> <groupId>com.lby</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>multi-dao</artifactId> <dependencies> <!-- 在dao中引用entity 能够在dao的代码中直接导入entity中的类和方法 --> <dependency> <groupId>com.lby</groupId> <artifactId>multi-entity</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- 若是配置依赖在父项目的 dependencyManagement 有--> <!-- 能够不写版本号 版本号继承父项目中的--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> </dependencies> </project>
在multi-dao写入dao接口
package com.lby.dao; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.lby.entity.Admin; public interface AdminDao extends BaseMapper<Admin> { }
完整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>multi-module-demo</artifactId> <groupId>com.lby</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>multi-service</artifactId> <dependencies> <!-- multi-service中须要引入 dao模块--> <dependency> <groupId>com.lby</groupId> <artifactId>multi-dao</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> </project>
写入业务类
package com.lby.service; import com.lby.dao.AdminDao; import com.lby.entity.Admin; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; /** * 之因此可以直接使用@Service注解 * 是由于 multi-service 模块 依赖了 multi-dao * multi-dao 依赖了 multi-entity * multi-entity 中的 MybatisPlus 依赖在项目中导入了Spring的jar包 */ @Service public class AdminService { @Autowired private AdminDao adminDao; public List<Admin> adminList(){ return adminDao.selectList(null); } }
multi-controller 模块是启动类所在的模块
因此咱们把配置文件 启动类以及SpringBoot集成maven的插件都放在这个项目中
1.完整的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>multi-module-demo</artifactId> <groupId>com.lby</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>multi-controller</artifactId> <dependencies> <!-- controller中须要引入service--> <dependency> <groupId>com.lby</groupId> <artifactId>multi-service</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!-- web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--测试--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <!-- spring-boot-maven-plugin 插件配置在启动类所在的模块--> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
2.application配置文件配置
#配置端口号 server: port: 8802 #数据源的配置 spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/cmfz?useUnicode=true&characterEncoding=UTF-8 username: root password: 123456 type: com.alibaba.druid.pool.DruidDataSource #mybatis-plus mybatis-plus: mapper-locations: classpath:mapper/*Mapper.xml # root 全局日志等级 默认是info 能够修改 debug warn error logging: level: root: info com.baizhi: debug
3.启动类代码
package com.lby; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @MapperScan("com.lby.dao") @SpringBootApplication public class AppRun { public static void main(String[] args) { SpringApplication.run(AppRun.class,args); } }
4.controller代码
package com.lby.controller; import com.lby.entity.Admin; import com.lby.service.AdminService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class AdminController { @Autowired private AdminService adminService; @RequestMapping("adminList") public List<Admin> adminList(){ return adminService.adminList(); } }
经过启动类启动项目
访问地址:http://localhost:8802/adminList 能够看到以下效果
若是要使用插件启动 须要先对父项目进行 clean 和 install操做
![]()
编写测试类
运行测试方法 效果以下
注意:启动类在哪一个模块,就经过哪一个模块打包
经过maven打包项目
找到打包好的项目 经过java -jar运行项目
访问地址:http://localhost:8802/adminList 能够看到以下效果
错误信息提示:
Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [qrcode-common,qrcode-manager-pojo] are excluded from annotation processing
缘由分析:循环依赖 死循环了
解决方案:修改模块中的依赖
在使用IDEA开发多项目的时候发现这样一个问题:修改pom文件以后,无论怎么刷新都不生效
解决方案:重启 IDEA 便可
本文涉及源码下载地址: https://gitee.com/bingqilinpe...
恭喜你完成了本章的学习,为你鼓掌!若是本文对你有帮助,请帮忙点赞,评论,转发,这对做者很重要,谢谢。
让咱们再次回顾本文的学习目标
- 掌握SpringBoot中多模块开发
要掌握SpringBoot更多的用法,请持续关注本系列教程。
欢迎关注本人公众号:鹿老师的Java笔记,将在长期更新Java技术图文教程和视频教程,Java学习经验,Java面试经验以及Java实战开发经验。
欢迎关注本人公众号:鹿老师的Java笔记,将在长期更新Java技术图文教程和视频教程,Java学习经验,Java面试经验以及Java实战开发经验。