一、前言
记录在IDEA中怎么搭建SpringBoot多模块(module)的过程,以一个交党费的项目为例,多模块的目录结构如下:
dajia-dangfei-api:存放实体类和一些service层接口
dajia-dangfei-provider:存放dao层接口及其实现类和service的实现类
dajia-dangfei-consumer:存放controller层
dajia-dangfei-web:存放前端页面等资源
二、搭建步骤
1、创建父工程
① IDEA 工具栏选择菜单 File -> New -> Project...
② 选择Spring Initializr,Initializr默认选择Default,点击Next
③ 填写输入框,点击Next
④ 这步不需要选择直接点Next
⑤ 点击Finish创建项目
⑥ 最终得到的项目目录结构如下
⑦ 删除无用的.mvn目录、src目录、mvnw及mvnw.cmd文件,最终只留.gitignore和pom.xml
2、创建子模块
① 选择项目根目录dajia-dangfei右键呼出菜单,选择New -> Module
② 选择Maven,点击Next
③ 填写ArifactId,点击Next
④ 修改Module name增加横杠提升可读性,点击Finish
⑤ 同理添加dajia-dangfei-provider、dajia-dangfei-consumer子模块,项目目录结构如下图
⑥添加dajia-dangfei-web的directory
⑦最终的目录结构如下
3、运行项目
① 在dajia-dangfei-consumer中创建com.dajia.income包,添加入口类ConsumerApplicationMain.java,并在income包下创建controller包放BillOrderController.java,目录结构如下
ConsumerApplicationMain.java:
@SpringBootApplicationpublic classConsumerApplicationMain {public static voidmain(String[] args) {
SpringApplication.run(ConsumerApplicationMain.class,args);
}
}
因为要通过前端访问BillOrderController中的方法,所以引入spring-boot-starter-web的jar包,在父工程的pom文件中定义,子模块自然可以用到
父工程dajia-dangfei的pom文件:
4.0.0
pom
dajia-dangfei-api
dajia-dangfei-provider
dajia-dangfei-consumer
org.springframework.boot
spring-boot-starter-parent
2.1.4.RELEASE
com.dajia
dajia-dangfei
0.0.1-SNAPSHOT
dajia-dangfei
Demo project for Spring Boot
1.8
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
引入springboot starter web的jar包
org.springframework.boot
spring-boot-starter
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-web
②BillOrderController中添加测试方法
@RestController
@RequestMapping("/billOrder")public classBillOrderController {
@RequestMapping("/test")publicString test(){return "hello World!!!";
}
}
③ 运行ConsumerApplicationMain类中的main方法启动项目,默认端口为8080,访问http://localhost:8080/billOrder/test得到如下效果
以上的项目虽然能启动,但是模块间的依赖关系还没添加,下面继续完善
4、配置模块间的依赖关系
各个子模块的依赖关系:dajia-dangfei-consumer依赖dajia-dangfei-provider,dajia-dangfei-provider依赖dajia-dangfei-api
①在dajia-dangfei-provider中的pom文件中添加dajia-dangfei-api依赖
dajia-dangfei-api
com.dajia
0.0.1-SNAPSHOT
②在dajia-dangfei-consumer中的pom文件中添加dajia-dangfei-provider依赖
dajia-dangfei-provider
com.dajia
0.0.1-SNAPSHOT
5、各模块见得相互调用,从前端到数据库
①dajia-dangfei-api中定义BillOrder实体类、BillOrderService接口
BillOrder.java
public class BillOrder implementsSerializable{private static final long serialVersionUID = -1764514095260116666L;/** 交费单ID
**/
privateString billOrderID;/** 交费单姓名
**/
privateString personName;/** 交费单证件号
**/
privateString idNumber;/** 应交金额
**/
privateBigDecimal payAmt;/** 交费单创建时间
**/
privateDate createTime;
}
BillOrderService.java
public interfaceBillOrderService {/*** 根据交费单ID查找对应的交费单
*@parambillOrderID
*@return
*/BillOrder getBillOrderByID(String billOrderID);
}
dajia-dangfei-api中的目录结构如下
②dajia-dangfei-provider中定义billOrderServiceImpl实现类,dao层接口,数据库连接
数据库连接
父工程引入mybatis-spring-boot-starter和mysql-connector-java的jar包
mysql
mysql-connector-java
5.1.34
org.mybatis.spring.boot
mybatis-spring-boot-starter
1.1.1
resources下配置application.properties文件,主要配置两部分。一个是数据库的连接,一个是mybatis的mapper文件路径
spring.datasource.url=jdbc:mysql://localhost:3306/databasezfy?useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456mybatis.config-locations=mybatis/mybatis-config.xml
mybatis.mapper-locations=mybatis/mapper/*.xml
填写billOrder-mapper.xml中对应的SQL语句
/p>
"/dtd/mybatis-3-mapper.dtd">
billOrderID,personName,idNumber,payAmt,createTime
SELECTFROM billOrder
WHERE billOrderID = #{billOrderID}
dao层接口,@Repository注解是为了在serviceImpl中可以同过@Autowired的方式注入BillOrderMapper
@Repositorypublic interfaceBillOrderMapper {/*** 根据交费单ID查找对应的交费单
*@parambillOrderID
*@return
*/BillOrder getBillOrderByBillOrderID(String billOrderID);
}
billOrderServiceImpl实现类,@Service注解是为了在controller中可以同过@Autowired的方式注入BillOrderService
@Servicepublic class BillOrderServiceImpl implementsBillOrderService{
@AutowiredprivateBillOrderMapper billOrderMapper;
@OverridepublicBillOrder getBillOrderByID(String billOrderID) {returnbillOrderMapper.getBillOrderByBillOrderID(billOrderID);
}
}
③dajia-dangfei-consumer中通过调用service中的方法实现查询
@RestController
@RequestMapping("/billOrder")public classBillOrderController {
@AutowiredprivateBillOrderService billOrderService;
@RequestMapping("/getBillOrderByID")publicBillOrder getBillOrderByID(){return billOrderService.getBillOrderByID("1");
}
}
运行ConsumerApplicationMain类中的main方法启动项目,会发现报错
Description:
Field billOrderMapper in com.dajia.income.service.impl.BillOrderServiceImpl required a bean of type 'com.dajia.income.dao.BillOrderMapper' that could not be found.
The injection point has the following annotations:
- @org.springframework.beans.factory.annotation.Autowired(required=true)
Action:
Consider defining a bean of type 'com.dajia.income.dao.BillOrderMapper' in your configuration.
原因:@Repository注解是Spring的,Spring在扫描注解时,取消了扫描抽象类和接口,所以无法找到你用@reponsitory注解的dao接口。两种方法解决:
一是用@Mapper注解替代@Repository注解,二是在启动项目时指定要扫描的包,我们这里使用第二种
@SpringBootApplication
@MapperScan("com.dajia.income.dao")public classConsumerApplicationMain {public static voidmain(String[] args) {
SpringApplication.run(ConsumerApplicationMain.class,args);
}
}
重新启动,访问http://localhost:8080/billOrder/getBillOrderByID得到如下效果
至此,一个简单的SpringBoot+Mybatis多模块项目已经搭建完毕,我们也通过启动项目调用接口验证其正确性。