目录
- Spring的简史
- 零、开发技术简介
- 一、创建项目
- 1、创建工程
- 2、创建Starter
- 3、启动项目
- 4、Spring Boot 配置
- 5、项目结构划分
- 二、基础结构功能
- 1、web支持
- 2、基础功能
- 3、添加系统用户功能,使用Postman测试接口
- 三、集成MyBatis,实现基础Mapper和Service
- 1、添加JDBC、配置数据源
- 2、集成MyBatis
- 3、添加MyBatis通用Mapper
- 4、添加分页插件PageHelper
- 5、配置自动扫描Mapper
- 6、定义基础Service
- 7、数据持久化测试
- 8、代码生成器
- 四、日志及全局异常处理
- 1、日志框架简介
- 2、配置日志
- 3、使用Logger
- 4、全局异常处理
- 五、数据库乐观锁
- 1、乐观锁
- 2、MyBatis插件介绍
- 3、数据版本插件
- 六、Druid数据库连接池
- 1、Druid
- 2、配置
- 七、Redis缓存
- 1、SpringBoot的缓存支持
- 2、Redis 配置及声明式缓存支持
- 3、Redis工具类
- 八、Swagger支持API文档
- 1、Swagger
- 2、配置
- 3、使用
- 九、项目优化调整
- 1、项目结构
- 2、开发规范
- 十、结语
Spring的简史
第一阶段:XML配置,在Spring1.x时代,使用Spring开发满眼都是xml配置的Bean,随着项目的扩大,我们需要把xml配置文件分放到不同的配置文件里,那时候需要频繁的在开发的类和配置文件之间切换。
第二阶段:注解配置,在Spring2.x时代,Spring提供声明Bean的注解,大大减少了配置量。应用的基本配置用xml,业务配置用注解。
第三阶段:Java配置,从Spring3.x到现在,Spring提供了Java配置,使用Java配置可以让你更理解你所配置的Bean。
Spring Boot:使用“习惯优于配置”的理念让你的项目快速运行起来。使用Spring Boot很容易创建一个独立运行、准生产级别的基于Spring框架的项目,使用Spring Boot你可以不用或者只需要很少的Spring配置。
下面就来使用Spring Boot一步步搭建一个前后端分离的应用开发框架,并且以后不断的去完善这个框架,往里面添加功能。后面以实战为主,不会介绍太多概念,取而代之的是详细的操作。
零、开发技术简介
开发平台:windows
开发工具:Intellij IDEA 2017.1
JDK:Java 8
Maven:maven-3.3.9
服务器:tomcat 8.0
数据库:MySQL 5.7
数据源:Druid1.1.6
缓存:Redis 3.2
日志框架:SLF4J+Logback
Spring Boot:1.5.7.RELEASE
ORM框架:MyBatis+通用Mapper
Spring Boot官方文档:Spring Boot Reference Guide
一、创建项目
这一节创建项目的基础结构,按照spring boot的思想,将各个不同的功能按照starter的形式拆分开来,做到灵活组合,并简单介绍下Spring Boot相关的东西。
1、创建工程
① 通过File > New > Project,新建工程,选择Spring Initializr,然后Next。
② 尽量为自己的框架想个好点的名字,可以去申请个自己的域名。我这里项目名称为Sunny,项目路径为com.lyyzoo.sunny。
③ 这里先什么都不选,后面再去集成。注意我的Spring Boot版本为1.5.9。Next
④ 定义好工程的目录,用一个专用目录吧,不要在一个目录下和其它东西杂在一起。之后点击Finish。
上面说的这么详细,只有一个目的,从一个开始就做好规范。
⑤ 生成的项目结构如下,可以自己去看下pom.xml里的内容。
2、创建Starter
先创建一个core核心、cache缓存、security授权认证,其它的后面再集成进去。
跟上面一样的方式,在Sunny下创建sunny-starter-core、sunny-starter-cache、sunny-starter-security子模块。
这样分模块后,我们以后需要哪个模块就引入哪个模块即可,如果哪个模块不满足需求,还可以重写该模块。
最终的项目结构如下:
3、启动项目
首先在core模块下来启动并了解SpringBoot项目。
① 在com.lyyzoo.core根目录下,有一个SunnyStarterCoreApplication,这是SpringBoot的入口类,通常是*Application的命名。
入口类里有一个main方法,其实就是一个标准的Java应用的入口方法。在main方法中使用SpringApplication.run启动Spring Boot项目。
然后看看@SpringBootApplication注解,@SpringBootApplication是Spring Boot的核心注解,是一个组合注解。
@EnableAutoConfiguration让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置。
Spring Boot会自动扫描@SpringBootApplication所在类的同级包以及下级包里的Bean。
② 先启动项目,这里可以看到有一个Spring Boot的启动程序,点击右边的按钮启动项目。看到控制台Spring的标志,就算是启动成功了。
③ 替换默认的banner
可以到http://patorjk.com/software/taag/这个网站生成一个自己项目的banner。创建banner.txt并放到resources根目录下。
4、Spring Boot 配置
① 配置文件
Spring Boot使用一个全局的配置文件application.properties或application.yaml,放置在src/main/resources目录下。我们可以在这个全局配置文件中对一些默认的配置值进行修改。
具体有哪些配置可到官网查找,有非常多的配置,不过大部分使用默认即可。Common application properties
然后,需要为不同的环境配置不同的配置文件,全局使用application-{profile}.properties指定不同环境配置文件。
我这里增加了开发环境(dev)和生产环境(prod)的配置文件,并通过在application.properties中设置spring.profiles.active=dev来指定当前环境。
② starter pom
Spring Boot为我们提供了简化开发绝大多数场景的starter pom,只要使用了应用场景所需的starter pom,无需繁杂的配置,就可以得到Spring Boot为我们提供的自动配置的Bean。
后面我们将会通过加入这些starter来一步步集成我们想要的功能。具体有哪些starter,可以到官网查看:Starters
③ 自动配置
Spring Boot关于自动配置的源码在spring-boot-autoconfigure中如下:
我们可以在application.properties中加入debug=true,查看当前项目中已启用和未启用的自动配置。
我们在application.properties中的配置其实就是覆盖spring-boot-autoconfigure里的默认配置,比如web相关配置在web包下。
常见的如HttpEncodingProperties配置http编码,里面自动配置的编码为UTF-8。
MultipartProperties,上传文件的属性,设置了上传最大文件1M。
ServerProperties,配置内嵌Servlet容器,配置端口、contextPath等等。
之前说@SpringBootApplication是Spring Boot的核心注解,但他的核心功能是由@EnableAutoConfiguration注解提供的。
@EnableAutoConfiguration注解通过@Import导入配置功能,在AutoConfigurationImportSelector中,通过SpringFactoriesLoader.loadFactoryNames扫描META-INF/spring.factories文件。
在spring.factories中,配置了需要自动配置的类,我们也可以通过这种方式添加自己的自动配置。
在spring-boot-autoconfigure下就有一个spring.factories,如下:
说了这么多,只为说明一点,Spring Boot为我们做了很多自动化的配置,搭建快速方便。
但是,正因为它为我们做了很多事情,就有很多坑,有时候,出了问题,我们可能很难找出问题所在,这时候,我们可能就要考虑下是否是自动配置导致的,有可能配置冲突了,或者没有使用上自定义的配置等等。
5、项目结构划分
core是项目的核心模块,结构初步规划如下:
base是项目的基础核心,定义一些基础类,如BaseController、BaseService等;
cache是缓存相关;
config是配置中心,模块所有的配置放到config里统一管理;
constants里定义系统的常量。
exception里封装一些基础的异常类;
system是系统模块;
util里则是一些通用工具类;
二、基础结构功能
1、web支持
只需在pom.xml中加入spring-boot-starter-web的依赖即可。
之后,查看POM的依赖树(插件:Maven Helper),可以看到引入了starter、tomcat、web支持等。可以看出,Sping Boot内嵌了servlet容器,默认tomcat。
自动配置在WebMvcAutoConfiguration和WebMvcProperties里,可自行查看源码,一般我们不需添加其他配置就可以启动这个web项目了。
2、基础功能
在core中添加一些基础的功能支持。
① 首先引入一些常用的依赖库,主要是一些常用工具类,方便以后的开发。
1 <!-- ******************************* 常用依赖库 ********************************** -->
2 <!-- 针对开发IO流功能的工具类库 -->
3 <dependency>
4 <groupId>commons-io</groupId>
5 <artifactId>commons-io</artifactId>
6 <version>${commons.io.version}</version>
7 </dependency>
8 <!-- 文件上传 -->
9 <dependency>
10 <groupId>commons-fileupload</groupId>
11 <artifactId>commons-fileupload</artifactId>
12 <version>${commons.fileupload.version}</version>
13 <exclusions>
14 <exclusion>
15 <groupId>commons-io</groupId>
16 <artifactId>commons-io</artifactId>
17 </exclusion>
18 </exclusions>
19 </dependency>
20 <!-- 常用的集合操作,丰富的工具类 -->
21 <dependency>
22 <groupId>commons-collections</groupId>
23 <artifactId>commons-collections</artifactId>
24 <version>${commons.collections.version}</version>
25 </dependency>
26 <!-- 操作javabean的工具包 -->
27 <dependency>
28 <groupId>commons-beanutils</groupId>
29 <artifactId>commons-beanutils</artifactId>
30 <version>${commons.beanutils.version}</version>
31 <exclusions>
32 <exclusion>
33 <groupId>commons-collections</groupId>
34 <artifactId>commons-collections</artifactId>
35 </exclusion>
36 </exclusions>
37 </dependency>
38 <!-- 包含一些通用的编码解码算法. 如:MD5、SHA1、Base64等 -->
39 <dependency>
40 <groupId>commons-codec</groupId>
41 <artifactId>commons-codec</artifactId>
42 <version>${commons.codec.version}</version>
43 </dependency>
44 <!-- 包含丰富的工具类如 StringUtils -->
45 <dependency>
46 <groupId>org.apache.commons</groupId>
47 <artifactId>commons-lang3</artifactId>
48 <version>${commons.lang3.version}</version>
49 </dependency>
50 <!--
51 Guava工程包含了若干被Google的Java项目广泛依赖的核心库. 集合[collections] 、缓存[caching] 、原生类型支持[primitives support] 、
52 并发库[concurrency libraries] 、通用注解[common annotations] 、字符串处理[string processing] 、I/O 等等。
53 -->
54 <dependency>
55 <groupId>com.google.guava</groupId>
56 <artifactId>guava</artifactId>
57 <version>${guava.version}</version>
58 </dependency>