在之前的文章中已经陆陆续续讲解了Java开发的一些基础知识,今天来整合这些知识,从无到有完整地搭建一个小型项目,把所讲解的内容逐一融合进去。技术选型是Spring+SpringBoot+Mybatis+MySQL+Maven+Redis+Kafka+Zookeeper+Junit。
![](http://dingyue.ws.126.net/2022/1031/fa2bb352j00rkltal001qc000xc00m8m.jpg)
一、框架选型说明
先简单地阐述一下我选择这套框架的原因:
1、总体框架是SSM,即Spring+SpringBoot+Mybatis,Springboot是一个微服务框架,延续了spring框架的核心思想IOC和AOP,简化了应用的开发和部署。再搭配Mybatis,简单易上手,目前又有很多的插件来实现自动生成代码,解决了代码繁琐的问题,更多的只关注于核心业务。
2、数据库使用MySQL开源数据库,比较适合个人开发,部署起来也比较容易,前面已经介绍了使用docker-compose可以快速地搭建mysql服务。
3、缓存数据库使用Redis,可以由浅到深,从单机版的redis再到集群版的redis,不断地加强个人对redis的理解和掌握,不管是windows还是linux,不管是单节点还是集群,小编都有接触和实战过,最终还是倾向于使用docker-compose进行部署安装,配置简单操作方便。
4、使用maven作为依赖,来快速地引入jar包进行开发,自动构建部署,参考之前详细的描述《Maven项目管理工具的介绍和使用》
5、集成junit单元测试框架,用于编写和运行可重复的测试,方便调试,参考《SpringBoot框架集成JUnit单元测试》
6、服务通信,使用消息队列MQ,这里使用Kafka,跟redis类似,我们从单机版再到集群版学习逐渐提升拔高,3.0版本目前还不是特别成熟,因此我们使用2.0版本,需要搭配Zookeeper一起使用,使用zookeeper来保存Kafka的元数据、监控Broker和分区的存活状态,并利用ZooKeeper来进行选举,参考《docker-compose部署Kafka》
本次搭建的是一个比较简单的独立小项目,因此暂时不考虑集群和多服务的场景,如果服务较多的话,建议使用注册中心统一管理,可以使用dubbo+zookeeper,再配合haproxy或者nginx,这些之前已有讲解。
二、开发工具和版本
小编使用的是市场上比较通用的一些开发工具,这个按照个人习惯和熟练度,仅作为参考:
1、代码开发工具,使用 IntelliJ IDEA。
2、MySQL使用5.7版本或者8.0版本均可,这两个版本有一定差异。根据官方说法,MySQL 8 要比 MySQL 5.7 快 2 倍,我这里主要搭建框架,暂不论证性能问题。客户端使用navicat 作为可视化工具,方便执行增删改查。可以使用 select version();命名查看MySQL的版本。
![](http://dingyue.ws.126.net/2022/1031/d7d70443j00rkltak000mc000k200agm.jpg)
3、jdk使用jdk 8 或者 jdk 11。这两个版本都是稳定版本。可以使用 java -version (或者javac -version)命令查看版本。
![](http://dingyue.ws.126.net/2022/1031/eb3a2455j00rkltal001wc000y800lmm.jpg)
4、redis 客户端可以使用Redis Desktop
![](http://dingyue.ws.126.net/2022/1031/a8ca87e2j00rkltal002fc000uw00lum.jpg)
三、框架搭建
1、创建SpringBoot项目
(1)首先打开 IntelliJ IDEA 编辑器创建项目,选择File ->New ->Project,选择 Spring Initializr,选择jdk版本,点击Next。
![](http://dingyue.ws.126.net/2022/1031/c19a425bj00rkltal0013c000qh00lhm.jpg)
(2)配置项目信息,Artifact为项目名称 ,group为项目组名,language设置为java ,packaging为打包方式(可选择Jar或者War),注意Type选择Maven Project(我们搭建的是Maven项目)。
![](http://dingyue.ws.126.net/2022/1031/6568ed95j00rkltal0014c000qo00lqm.jpg)
(3)选择相应的依赖,选中Lombok、MyBatis、MySQL驱动、Redis、Kafka,当然也可以自己导入,注意默认导入的可能存在版本不匹配的问题,不太推荐这种方式引入依赖。
![](http://dingyue.ws.126.net/2022/1031/9446a354j00rkltal001gc000qo00lqm.jpg)
(4)输入项目名称,创建完成,点击Finish
![](http://dingyue.ws.126.net/2022/1031/8b1ad52dj00rkltal000vc000qo00lqm.jpg)
2、项目配置
项目刚开始搭建完成时,只有一个配置文件application.properties,并且这个配置文件一开始是没有任何内容的,我们把需要的配置加上去,配置文件可以是application.properties格式,也可以是application.yml格式,小编更倾向于application.yml格式,层次更清晰。
项目配置主要包含以下几个方面的内容:
(1)项目的名称、上下文、端口号;
(2)MySQL数据库连接的类型、地址、端口号,以及用户名和密码;
(3)缓存redis数据库连接的ip、端口,密码等,注意redis的单机版和集群版配置差异较大;
(4)日志文件的配置,需要单独配置一个日志的配置类文件logback-spring.xml
(5)mybatis的配置
(6)kafka消息队列的配置
综上,application.yml的配置内容如下:
![](http://dingyue.ws.126.net/2022/1031/67dfa770j00rkltal0041c0013w0189m.jpg)
日志的配置类文件logback-spring.xml内容如下:
![](http://dingyue.ws.126.net/2022/1031/9446a354j00rkltal001gc000qo00lqm.jpg)
3、代码集成
编写代码时,我们往往按照entity->Controller->Service/ServiceImpl->Dao->Xml这样的层次来编写业务模块,其他的还会涉及配置模块Config以及工具类Util。
![](http://dingyue.ws.126.net/2022/1031/b67c167dj00rkltal000uc000qz00ajm.jpg)
整体结构如下,逐一在过程中根据提示引入maven仓库的jar包:
![](http://dingyue.ws.126.net/2022/1031/609f9dd2j00rkltal002ic0010w00o9m.jpg)
接下来我们注意看下每个模块的配置:
(1)启动类SpringBootDemoApplication(命名没有特殊要求)
我们要在外层(相对于config、controller这些文件夹来说的,就是跟controller包同级)写个启动类SpringBootStart。启动main方法,为什么要在controller包同级的地方写个启动类SpringBootStart,这是为了让SpringBootStart处于最外层,这样他能够读取到Controller里面所有的配置文件,当然啦,你也可以在controller下面去写启动方法,不过这样不利于后面测试,因为你每写一个controller都需要改SpringBootStart方法
![](http://dingyue.ws.126.net/2022/1031/20aa9263j00rkltal0012c000ks00dom.jpg)
(2)controller类详细信息如下:
![](http://dingyue.ws.126.net/2022/1031/398073b2j00rkltal002ic000qx00yom.jpg)
(3)service接口层
![](http://dingyue.ws.126.net/2022/1031/7f054343j00rkltal001dc000v200lam.jpg)
serviceImpl接口实现层
![](http://dingyue.ws.126.net/2022/1031/f3ea4986j00rkltal002vc000ys010ym.jpg)
(4)dao层
![](http://dingyue.ws.126.net/2022/1031/b0addf9fj00rkltal001fc000v000j2m.jpg)
(5)集成mybatis
刚开始创建Maven类型Springboot框架项目的时候,已经添加了Mybatis依赖,也可以手动在pom.xml中添加mybatis的jar依赖。以下是pom.xml文件中添加的所有依赖。
![](http://dingyue.ws.126.net/2022/1031/c886aa4ej00rkltal004tc000um01pmm.jpg)
然后在resources下创建mybatis文件夹,编写xml文件,主要就是SQL语句。
![](http://dingyue.ws.126.net/2022/1031/cd615278j00rkltal003uc0015h00oym.jpg)
4、运行项目
启动项目,配置启动服务SpringBootDemoApplication
![](http://dingyue.ws.126.net/2022/1031/df7a89b3j00rkltal001lc000s300k7m.jpg)
使用右侧的maven快捷进行清理、编译和打包,本地运行时先不用打包,运行后控制台会打印相关日志。
![](http://dingyue.ws.126.net/2022/1031/2faaa61fj00rkltal004mc001gj00r3m.jpg)
5、集成AOP
(1)pom.xml中已添加spring切面aop依赖
(2) 创建日志实体类
![](http://dingyue.ws.126.net/2022/1031/e92a2417j00rkltak000qc000ji00g0m.jpg)
(3) 使用spring 的 aop 技术切到自定义注解上,所以先创建一个自定义注解类
![](http://dingyue.ws.126.net/2022/1031/1d7b5fc1j00rkltal001ec000vu00h8m.jpg)
(4) 创建aop切面实现类
![](http://dingyue.ws.126.net/2022/1031/c4276546j00rkltal003sc000r0019im.jpg)
写入日志表,需要编写SysLogService和dao层以及xml层,这个跟其他业务的写法类似,这里不做赘述。
(5) 在需要监控的方法上添加 aop的自定义注解
格式为 @+自定义注解的类名 例如:@MyLog
![](http://dingyue.ws.126.net/2022/1031/87a97c68j00rkltal000mc000jw008lm.jpg)
6、事务回滚
(1)、启动类添加注解@EnableTransactionManagement 开启事务支持。
(2)、在方法上添加注解@Transactional
如果想要对抛出的任何异常都进行自动回滚(而不是只针对RuntimeException),需要在使用@Transactional(rollbackFor = Exception.class),并throw抛出。可参考上面添加AOP的例子中的手动事务回滚。
7、集成Junit
在test目录下,编写Junit测试类,需要在maven引入junit依赖包,示例如下:
![](http://dingyue.ws.126.net/2022/1031/5cd1b8eaj00rkltal0025c000va00lkm.jpg)
8、集成Redis
(1)首先编写redis静态变量配置类(基于我使用的Redis哨兵集群),后面需要用到这里的参数。
![](http://dingyue.ws.126.net/2022/1031/c4429bebj00rkltal001oc000n300l5m.jpg)
(2)Redis配置类
![](http://dingyue.ws.126.net/2022/1031/e92a2417j00rkltak000qc000ji00g0m.jpg)
(3)redis 带有分片的哨兵连接池
![](http://dingyue.ws.126.net/2022/1031/c420bc20j00rkltal00f1c000wz056qm.jpg)
(4)redis 服务实现
![](http://dingyue.ws.126.net/2022/1031/0d6a7435j00rkltak002cc000vr00qcm.jpg)
9、集成Kafka
主要是Kafka生产者和消费者,配置如下:
![](http://dingyue.ws.126.net/2022/1031/b54f57f2j00rkltal004gc000t201i2m.jpg)
生产者服务:
![](http://dingyue.ws.126.net/2022/1031/98883c15j00rkltak000oc000n400b4m.jpg)
消费者服务:
![](http://dingyue.ws.126.net/2022/1031/035a4677j00rkltal001gc000s600h1m.jpg)
热门跟贴