SpringBoot2.1版本的个人应用开发框架 - 从0-1搭建个人框架

6,790 阅读9分钟

前言

一直以来写代码都是在别人写好的框架上写代码,其实我一直想自己搭一个框架试一试,正好有机会,我就试着自己搭一下,搭的好与坏我觉得不重要,重要的是在这次搭框架的过程中,一定能学习到很多东西。在这里我借鉴了网上很多大神的博客,主要参考的还是下面链接的博主博客,第一次搭建也许在大局观以及知识和经验的储备不足,如有什么错误的地方,望即时纠正,项目采用springboot多模块结构。

后端项目地址:SpringBoot2.1版本的个人应用开发框架

前端项目地址:ywh-vue-admin

主要参考:基于SpringBoot搭建应用开发框架

springboot基础学习:springboot学习目录

创建Springboot基础结构

左侧选择Spring Initializr 后选择jdk的版本,我这里用的是jdk1.8版本

新建项目01

根据自己的命名规范设置Group和Artifact,并选择Type类型为Maven POM

pom

选择依赖那不选择任何依赖直接下一步,直到定义项目的名称,以及项目存储的地方,点击finish完成本次创建,记得选择本项目的存储位置,最终项目的结构如此。

20190409161436

父pom文件中标签中的jar要改成pom,一定要修改,否则各个模块之间无法传递依赖

<groupId>com.ywh</groupId>
<artifactId>springcloud</artifactId>
<version>0.0.1-SNAPSHOT</version>
<!-- 父pom.xml中的必须为pom类型 便于子模块之间传递依赖 -->
<packaging>pom</packaging>

创建Module(子模块)

在根据参考的博客和网上一些博客。分模块有很多种分法,大多数是根据controller、service、dao等等分模块的,这种的分法我认为分的太细了,这种的我觉得适用于大公司,人多的那种,每个人负责一个模块进行开发,出了错误也可以快速定位,并且有具体的人负责修改就可以了(也有可能是我的认知太浅薄,理解错了)。

我暂时主要分为:

  • ywh-starter-core —— 用来放自己写的业务代码
  • ywh-starter-cache —— 用来放项目缓存
  • ywh-starter-security —— 用来做权限认证
  • ywh-starter-common —— 放一些工具类,以及一些基础的常量、变量、枚举类等

在项目上右键>New>Module,首先创建core子模块

创建子模块

Group

创建Module也是springboot项目,不过在选择项目保存的时候一定要在本项目中新建一个文件来保存我们的子模块,这样才不会模块的结构跑到我们的外面来,如下图

保存子模块

按着以上方式创建ywh-starter-core,ywh-starter-cache,ywh-starter-common,ywh-starter-security等模块,创建所有模块以后的项目结构如下:

项目总体结构

修改项目通用配置

项目创建好以后我们对项目的所有pom.xml文件修改一下,首先是子模块pom.xml中继承父项目并且把spring-boot-starterspring-boot-starter-test依赖删除即可,因为我们会在父pom.xml中添加web依赖和test依赖,子模块继承以后会使用父pom.xml的依赖,子模块以core为例子,其他按着core修改即可,其次是父pom.xml中添加子模块的配置,父pom就是上图中最外侧的pom文件

<!-- 继承父项目 -->
<parent>
	<groupId>com.ywh</groupId>
	<artifactId>springcloud</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<relativePath>../pom.xml</relativePath> <!-- lookup parent from repository -->
</parent>
<!-- 子模块 -->
<modules>
	<module>ywh-starter-cache</module>   <!-- 缓存子模块 -->
	<module>ywh-starter-common</module>   <!-- 工具模块 -->
	<module>ywh-starter-core</module>   <!-- 写代码的子模块 -->
	<module>ywh-starter-security</module>  <!-- 权限子模块 -->
</modules>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
</properties>

确定模块之间的依赖关系

子模块之间也是有依赖关系的,否则在core中是无法调用其他模块中的东西的,所以我这里的依赖关系是core->security->cache->common,这里的依赖关系先暂时定下,以后有变化时可以再进行确定修改,一定要注意不要循环依赖(就是core->security,security->core,这样就会导致循环依赖),以core为例,修改pom.xml如下:

<dependency>
    <groupId>com.ywh</groupId>
    <artifactId>security</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>
<!-- 按照上面的所属依赖关系 修改每一个子模块的pom.xml -->

在父pom.xml中引入一些我们公用的依赖分别如下,关于什么依赖可以放在父pom.xml下什么可以放在其他子模块下,我是这么理解的,当一个依赖有两个以上的子模块使用的时候,就要把这个依赖提出来放到父pom下,这个依赖只有这一个子模块使用,就可以单独放在某一个子模块下。当然了为了图方便可以把所有的依赖都放在父pom.xml中。

引入公共依赖

在父pom文件中引入一些公用依赖

<!-- web依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
 
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
 
<!-- 引入fastjson依赖包 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.53</version>
</dependency>
 
<!-- io流的依赖 拥有快速读写,文件目录拷贝与删除等等,io的操作   目录与文件的监听等功能 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>
 
<!-- 对文件上传 下载的依赖 -->
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.3</version>
</dependency>
 
<!-- 提供了丰富的集合操作 -->
<dependency>
    <groupId>commons-collections</groupId>
    <artifactId>commons-collections</artifactId>
    <version>3.2.1</version>
</dependency>
 
<!-- 提供了基本编码解码算法,如base64,md5,sha等 -->
<dependency>
    <groupId>commons-codec</groupId>
    <artifactId>commons-codec</artifactId>
    <version>1.11</version>
</dependency>
 
<!-- 丰富的工具类 如StringUtils -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.8.1</version>
</dependency>
 
<!-- 连接池 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.6.0</version>
</dependency>

创建yml文件并修改banner图

Spring Boot使用一个全局的配置文件application.properties或application.yml,放置在src/main/resources目录下。我们可以在这个全局配置文件中对一些默认的配置值进行修改,把所有的application.properties的后缀名修改成.yml,这个不是必须的,如果习惯.properties的方式也可以不修改,是一样的,具体有哪些配置可到官网查找,有非常多的配置,不过大部分使用默认即可。 具体有哪些配置可到官网查找,有非常多的配置,不过大部分使用默认即可 SpringBoot官方配置文件参考

我增加了开发环境(dev)和生产环境(prod)的配置文件,并通过在application.yml中设置spring.profiles.active=dev来指定当前环境,yml文件必须以application开头接 -*。

yml文件

替换springboot项目启动时控制台显示的banner图,生成banner图这个网站生成一个自己项目的banner。创建banner.txt并放到resources根目录下,我是以core启动项目的,所以我放到了core的子模块下,启动以后就能看到修改后的banner图了。

banner图

修改启动类CoreApplication,扫描配为com.ywh,如果不增加,在其他的模块中添加的配置类会导致扫描不到的情况

@SpringBootApplication(scanBasePackages = "com.ywh")

集成Druid + Mybatis-Plus

实现基础controller、service、前端封装返回json体等

日志自定义和全局异常处理

集成Redis缓存

集成SpringSecurity

整合vue实现前后端分离

使用docker + Nginx打包部署

结语

这一篇笔记终于写完了,从项目的创建到部署的流程全部走了一遍,实现了从0-1,我知道这里的问题还有很多;在搭建这个框架之间解决了以前有的疑问,但是又多了些新的疑问,这都需要之后的学习来解答,成功不是一蹴而就,要慢慢来;我还想把这个框架丰富一下,修改成微服务的架构,下一阶段学习

  • springcloud和dubbo
  • redis进阶
  • nginx的系统学习
  • es搜索引擎
  • 消息队列

等等吧,一些中间件的学习

回看我前几章的笔记,其实还比较墨迹的,而且代码还不优雅(因为理解的还是不够透彻吧),什么叫做优雅,在我看来就是没有多余的操作,简单明了,不会把一件事情弄得很复杂,这一点还需要很大的努力,其实呢在我写这些笔记的时候,我的想法就是,一是给自己记笔记,以后回看的时候有一个记忆点,二呢就是给像我一样迷茫不知道该学什么的提供一种思路,毕竟我这个所谓的个人框架只是把一些东西放在一起了,有点东北乱炖的感觉,但是最起码可以当一个参考,这里面用到的东西还是值得一学的。

我觉得作为一个年轻人,要不断的充实自己的知识,只有学的更多,做东西的时候才能思考的更多,解决的办法也就更多。

我喜欢编程,编程让我有成就感,让我有学下去的动力。