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模块目录:
resources配置文件解读:
我特意将数据库配置拆成了两个,一个是开发库的数据库配置,一个是生产库的数据库配置。
rescource/mapper下面存放的是mapper的xml文件,rescource/mybatis-config.xml是mybatis的配置信息(设置、插件等)。
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的编制过程。