zoukankan      html  css  js  c++  java
  • 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多模块项目已经搭建完毕,我们也通过启动项目调用接口验证其正确性。

  • 相关阅读:
    SQL server 2005转换为SQL server 2000的方法
    C#异步编程(转)
    在存储过程中如何使用另一个存储过程返回的结果集
    开始研究开源GIS软件之旅(SharpMap和WorldWind)
    WorldWind学习系列一:顺利起航篇
    WorldWind学习系列二:擒贼先擒王篇1
    WebService安全访问(资料收集)
    平台调用:C# 使用非托管dll函数
    VS2008环境下C#对Excel的操作 [C#] (收集转载)
    WorldWind学习系列二:擒贼先擒王篇2
  • 原文地址:https://www.cnblogs.com/zfyang2429/p/10801959.html
Copyright © 2011-2022 走看看