Spring Boot(三):SpringBoot多模块(module)项目搭建

一、前言

  记录在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:

@SpringBootApplication
public class ConsumerApplicationMain {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplicationMain.class,args);
    }
}

因为要通过前端访问BillOrderController中的方法,所以引入spring-boot-starter-web的jar包,在父工程的pom文件中定义,子模块自然可以用到

父工程dajia-dangfei的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>
    <packaging>pom</packaging>
    <modules>
        <module>dajia-dangfei-api</module>
        <module>dajia-dangfei-provider</module>
        <module>dajia-dangfei-consumer</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.dajia</groupId>
    <artifactId>dajia-dangfei</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>dajia-dangfei</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>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

引入springboot starter web的jar包

<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>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

</dependencies>

②BillOrderController中添加测试方法

@RestController
@RequestMapping("/billOrder")
public class BillOrderController {

    @RequestMapping("/test")
    public String 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依赖

<dependencies>
        <dependency>
            <artifactId>dajia-dangfei-api</artifactId>
            <groupId>com.dajia</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
</dependencies>

②在dajia-dangfei-consumer中的pom文件中添加dajia-dangfei-provider依赖

<dependencies>
        <dependency>
            <artifactId>dajia-dangfei-provider</artifactId>
            <groupId>com.dajia</groupId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
</dependencies>

5、各模块见得相互调用,从前端到数据库

①dajia-dangfei-api中定义BillOrder实体类、BillOrderService接口

BillOrder.java

public class BillOrder implements Serializable{
    private static final long serialVersionUID = -1764514095260116666L;
    /*
    * 交费单ID
    * */
    private String billOrderID;
    /*
    * 交费单姓名
    * */
    private String personName;
    /*
    * 交费单证件号
    * */
    private String idNumber;
    /*
    * 应交金额
    * */
    private BigDecimal payAmt;
    /*
    * 交费单创建时间
    * */
    private Date createTime;
}

BillOrderService.java

public interface BillOrderService {
    /**
     * 根据交费单ID查找对应的交费单
     * @param billOrderID
     * @return
     */
    BillOrder getBillOrderByID(String billOrderID);

}

dajia-dangfei-api中的目录结构如下

②dajia-dangfei-provider中定义billOrderServiceImpl实现类,dao层接口,数据库连接

数据库连接

  父工程引入mybatis-spring-boot-starter和mysql-connector-java的jar包

<dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
</dependency>

<dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
</dependency>

  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=123456

mybatis.config-locations=mybatis/mybatis-config.xml
mybatis.mapper-locations=mybatis/mapper/*.xml

  填写billOrder-mapper.xml中对应的SQL语句

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dajia.income.dao.BillOrderMapper">
    <sql id="base_column">
      billOrderID,personName,idNumber,payAmt,createTime
    </sql>

    <select id="getBillOrderByID" resultType="com.dajia.income.entity.BillOrder" parameterType="string">
        SELECT <include refid="base_column"/>
        FROM billOrder
        WHERE billOrderID = #{billOrderID}
    </select>

</mapper>

dao层接口,@Repository注解是为了在serviceImpl中可以同过@Autowired的方式注入BillOrderMapper

@Repository
public interface BillOrderMapper {

    /**
     * 根据交费单ID查找对应的交费单
     * @param billOrderID
     * @return
     */
    BillOrder getBillOrderByBillOrderID(String billOrderID);
}

billOrderServiceImpl实现类,@Service注解是为了在controller中可以同过@Autowired的方式注入BillOrderService

@Service
public class BillOrderServiceImpl implements BillOrderService{

    @Autowired
    private BillOrderMapper billOrderMapper;

    @Override
    public BillOrder getBillOrderByID(String billOrderID) {
        return billOrderMapper.getBillOrderByBillOrderID(billOrderID);
    }
}

③dajia-dangfei-consumer中通过调用service中的方法实现查询

@RestController
@RequestMapping("/billOrder")
public class BillOrderController {

    @Autowired
    private BillOrderService billOrderService;

    @RequestMapping("/getBillOrderByID")
    public BillOrder 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 class ConsumerApplicationMain {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplicationMain.class,args);
    }
}

重新启动,访问http://localhost:8080/billOrder/getBillOrderByID得到如下效果

至此,一个简单的SpringBoot+Mybatis多模块项目已经搭建完毕,我们也通过启动项目调用接口验证其正确性。

原文地址:https://www.cnblogs.com/zfyang2429/p/10801959.html