springBoot+tomcat+mybatis项目搭建

1 前言

经过几年工作,近期发现自身记忆力有所下降,原来琢磨明白的一些东西都可能遗忘了。所以准备开始写写博客,把原来的一些东西和新学习的东西做个记录。
最近在南昌一家公司做架构和项目经理,团队目前应用使用kotlin和原来leader自行实现的代码框架。但是在开发过程中开发们对框架理解不够透彻造成滥用,而kotlin的使用又造成了开发的入门门槛。所以讨论后在20年启动重构,并换回SSM的模式进行开发。

1.1 应用架构

本次的整理只是初步的一个设想,应用结构如图:
应用架构

1.2 后端应用结构

依照上面的架构图,考虑到后续分布式、服务化、微服务等相关升级改造,所以将应用结构定义为(自顶向下依赖):

  • app app代码存放目录(单独git管理)
  • web controller层,前端资源及代码文件存放(前后端分离,前端可单独管理)
  • service 对外服务、功能实现组织、验权
  • biz 功能实现的业务逻辑处理
  • dao 数据操作
  • common 工具、枚举、常量
  • lib maven中无法引入的二方库、三方库
  • document 文档相关

1.3 搭建应用

1.3.1 应用模块图

应用采取maven构建,使用idea创建maven应用后,新增对应模块,然后开始对pom依赖进行修改和整理。

应用模块结构

1.3.2 关键点

应用的pom依赖需要组织好,要理解pom中dependencies和dependencyManagement的区别。
参见转载:https://blog.csdn.net/liutengteng130/article/details/46991829

另外,主pom中的模块,需要确定好顺序关系,不然mvn打包会报找不到模块依赖。

    <modules>
        <module>common</module>
        <module>dao</module>
        <module>biz</module>
        <module>service</module>
        <module>web</module>
    </modules>

1.4 引入springBoot

因为本次应用我采取的是多模块模式,同时主应用只是作为依赖的统一管理,不做代码实现和编译打包(交给web模块去做),所以我的实现方式为:

1.4.1 主pom

引入spring-boot依赖:

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${project.spring-boot-version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

1.4.2 web模块pom

引入springBoot依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

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

同时修改打包方式为:

<packaging>war</packaging>

1.4.3 app入口

Application.java存放在web模块下

package com.kuoxu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.PropertySource;

/**
 * Application
 *
 * PropertySource 显示指定配置文件
 * @author hemw.it
 * @date 2019/9/12 10:22
 */
@SpringBootApplication(scanBasePackages = "com.kuoxu")
@ServletComponentScan
public class Application extends SpringBootServletInitializer {

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

    /**
     *重写configure
     * @param builder
     * @return
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }
}

1.4.4 关键点

对于不使用springBoot的默认tomcat,而是使用自己提供的tomcat。需要如我web的pom配置一样,排除默认的tomcat依赖,然后引入tomcat的依赖,并将其scope设置为provide,让它不会在编译时被打包到classes下面。
scope的说明参见转载:https://blog.csdn.net/high2011/article/details/90369196

对于springBoot的编译,因为我们是多模块项目,使用springBoot的默认打包插件会有问题,提示包依赖找不到,所以换成maven的打包插件。
bulid的相关配置:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.3</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <phase>compile</phase>
                    </execution>
                </executions>
                <configuration>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                    <compilerArguments>
                        <extdirs>${project.build.directory}/lib</extdirs>
                    </compilerArguments>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.1.1</version>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>compile</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <!-- ${project.build.directory}为Maven内置变量,缺省为target -->
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!-- 表示是否不包含间接依赖的包 -->
                            <excludeTransitive>false</excludeTransitive>
                            <!-- 表示复制的jar文件去掉版本信息 -->
                            <stripVersion>true</stripVersion>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        <finalName>web</finalName>
    </build>

1.5 引入mybatis

1.5.1 主pom

本项目库暂时使用postgresql,引入mybatis依赖:

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

1.5.2 dao模块pom

引入mybatis依赖和postgresql依赖:

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

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>

1.5.3 web模块pom

因为web模块是打包编译的模块,所以也需要加入部分mybatis依赖。

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

1.5.4 关键点

dao模块目录:
dao层目录结构
resources配置文件解读:
我特意将数据库配置拆成了两个,一个是开发库的数据库配置,一个是生产库的数据库配置。
rescource/mapper下面存放的是mapper的xml文件,rescource/mybatis-config.xml是mybatis的配置信息(设置、插件等)。

web模块(编译启动模块):
web模块目录结构
配置文件(使用properties和yml混合只是个人为了测试,大家可以全用一种模式):
application.properties

# 公用配置信息存放,基础配置
spring.profiles.active = dev

application-dev.yml

# 环境差异配置存放(开发)
env: dev
debug: true
spring:
  profiles: {include: dev_data}

application-proc.yml

# 环境差异配置存放(生成)
env: proc
debug: false
spring:
  profiles: {include: proc_data}

application-dev.yml和application-proc.yml中include的就是dao模块resources下的配置文件。
以application-dev_data.yml为例:

# 环境差异配置存放(开发时数据库)
spring:
  datasource:
    platform: postgres
    url: jdbc:postgresql://ip/xxx
    username: postgres
    password: xxx
    driverClassName: org.postgresql.Driver
mybatis:
  mapper-locations: classpath:mapper/*.xml
  config-location: classpath:mybatis-config.xml

修改Application.java,加入mybatis的信息。

package com.kuoxu;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.context.annotation.PropertySource;

/**
 * Application
 *
 * PropertySource 显示指定配置文件
 * @author hemw.it
 * @date 2019/9/12 10:22
 */
@SpringBootApplication(scanBasePackages = "com.kuoxu")
@ServletComponentScan
@PropertySource("classpath:application.properties")
@MapperScan("com.kuoxu.dao.mappers.mapper")
public class Application extends SpringBootServletInitializer {

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

    /**
     *重写configure
     * @param builder
     * @return
     */
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
        return builder.sources(Application.class);
    }
}

对于springBoot的多环境配置文件,自行百度,本文中,我使用的模式即是多环境配置的方式。

1.6 后记

至此,项目已基本完成,后面还会更新将项目部署进docker容器和dockerfile的编制过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值