百度
360搜索
搜狗搜索

springboot项目结构,「开源」springboot快速开发框架推荐,接私活利器详细介绍

本文目录一览: SpringBoot目录结构

以Maven工程形式新建一个springboot项目。目录结构如下:

重点介绍resources目录:

在resources文件夹或与其并列的文件夹下建立public文件夹,在public文件夹下的html文件可以通过浏览器中输入文件+后缀名的方式直接访问的.??

一、public文件夹(需要自己手动新建),就相当于在eclipse的web项目中的WEB-INF文件夹外的文件,是不需要通过服务器内部进行访问的。

二、templates文件夹,是放置模板文件的,因此需要视图解析器来解析它。所以必须通过服务器内部进行访问,也就是要走控制器--服务--视图解析器这个流程才行。

三、static文件夹,既不能直接访问,也不能通过服务器访问到。因此,这个文件夹,可能是放一些css、图片这样的文件供服务器内部引用。

application.properties文件,全局配置文件。

才疏学浅之处,切莫在意。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ——2019.6.10? 下午

Spring Boot从入门到精通-项目搭建

Spring Boot极大的简化了java项目的开发,在之前如果想要开发一个java项目,需要安装tomcat或者其他容器插件。但是Spring Boot内部已经集成了tomcat,因此项目的启动异常的方便。而且Spring Boot的开发中有很多默认的配置,帮助我们省去了相当多的时间。
在idea中,File-->New-->Project...

选择Spring Initializr

填写你的maven项目的groupId和artifact等项目基本信息之后,在依赖中选择Web-->Web之后finish。

目录结构如下:

直接运行DemoApplication.java就可以运行项目了。
你也可以使用官方模板快速开始Spring Boot项目
接下来我们分析一下pom.xml中的依赖。
Spring Boot中还有一个很重要的文件:application.properties/yml/yaml文件。
项目中的配置不再是以前的xml形式,而是写在这个文件中。Spring Boot已经为我们提供了很多默认的配置。
以上我们搭建了一个完全没有进行任何操作的Spring Boot框架,下一节我们将继续为我们的项目添砖加瓦一步步深入了解Spring Boot。Spring Boot从入门到精通-初识注解、接口

如何构建spring boot

SpringMVC是非常伟大的框架,开源,发展迅速。优秀的设计必然会划分、解耦。所以,spring有很多子项目,比如core、context、bean、mvc等。这对知根底的人来说很简单明了,然而springmvc就是为了傻瓜式的操作而发明的。对于初学springmvc的人来说,想要入手就开发需要拷贝一连串的dependency而不知道这个是干嘛,不知道是不是少了依赖。像我刚接触springmvc的时候到处百度教程而发现各有不同,于是复制了一个又一个代码却不能自己设置,根本原因是不了解各个依赖的包。
Spring-Boot 正是为了解决繁复的代码配置而产生的。Spring-Boot 也是基于java-base 开发的代码,及不用xml文件配置,所有代码都由java来完成。还可以加入Groovy的动态语言执行。
Spring Boot充分利用了JavaConfig的配置模式以及逗约定优于配置地的理念,能够极大的简化基于Spring
MVC的Web应用和REST服务开发。
Spring
4倡导微服务的架构,针对这一理念,近来在微博上也有一些有价值的讨论,如这里和这里。微服务架构倡导将功能拆分到离散的服务中,独立地进行部署,Spring
Boot能够很方便地将应用打包成独立可运行的JAR包,因此在开发模式上很契合这一理念。目前,Spring
Boot依然是0.5.0的里程碑版本,因此相关的文档尚不完善,本文将会以一个简单的样例来介绍基于这个项目的开发过程。
要Spring
Boot进行功能开发,需要使用Gradle或者Maven作为构建工具。在本例中,我们会使用Eclipse和Maven插件进行开发。要使用Spring
Boot,首先创建一个Maven工程,并修改Maven主要的配置文件pom.xml,如下所示:

org.springframework.boot

spring-boot-starter-parent

0.5.0.M7

org.springframework.boot

spring-boot-starter-web

org.thymeleaf

thymeleaf-spring3

com.levin.Application

org.springframework.boot

spring-boot-maven-plugin

spring-milestone

false

spring-milestone

false

在上面的配置中,需要将工程的parent设置为spring-boot-starter-parent,并添加对spring-boot-starter-web的依赖,这样我们就无需设置各个依赖项及其版本信息了。并且在构建中要声明使用spring-boot-maven-plugin这个插件,它会对Maven打包形成的JAR进行二次修改,最终产生符合我们要求的内容结构。

在我们的应用中将要发布一个REST服务,显示一个基本的用户信息,首先定义一个简单的模型类:

package com.levin;

public class Person {

private String name;

private String email;

public Person(String name, String email) {

this.name = name;

this.email = email;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getEmail() {

return email;

}

public void setEmail(String email) {

this.email = email;

}

}

接下来,我们需要声明一个Spring MVC的Controller,响应对实体的请求:

@Controller

public class ShowPersonController {

@RequestMapping("/showPerson")

public @ResponseBody Person showPerson() {

return new Person("levinzhang","levinzhang1981@gmail.com");

}

}

这个类与我们在使用Spring MVC定义Controller时并无任何差别。接下来,我们需要声明一个主类启动这个应用程序:

@ComponentScan

@EnableAutoConfiguration

public class Application {

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

}

这个类的main方法中使用了SpringApplication帮助类,并以Application这个类作为配置来启动Spring的应用上下文。在这个类中使用了ComponentScan以及EnableAutoConfiguration注解,其中ComponentScan注解会告知Spring扫描指定的包来初始化Spring

Bean,这能够确保我们声明的Bean能够被发现。EnableAutoConfiguration将会启动自动配置模式,在我们的配置中会将对Tomcat的依赖级联进来,因此在应用启动时将会自动启动一个嵌入式的Tomcat,因为在样例中使用了Spring

MVC,所以也会自动注册所需的DispatcherServlet,这都不需要类似web.xml这样的配置。

在Eclipse中要运行这个应用的话,可以直接以Java

Application的形式来运行这个main函数,此时会启动应用,我们在浏览器中可以看到如下的运行效果,这就是我们想要的REST服务:

在开发调试完成之后,可以将应用打成JAR包的形式,在Eclipse中可以直接使用Maven插件的package命令,最终会形成一个可运行的JAR包。我们使用java

–jar命令就可以运行这个JAR包了。所呈现出的效果与在调试期是一样的。现在看一下这个JAR包解压后的目录结构:

这个JAR包与传统JAR包的不同之处在于里面有一个名为lib的目录,在这个目录中包含了这个简单应用所依赖的其他JAR包,其中也包含内置的嵌入式Tomcat,正是使用它,才能发布服务和访问Web资源。除了我们编写的源码所编译形成的CLASS以外,在org目录下还有许多Spring所提供的CLASS,正是依赖这些CLASS,才能够加载位于lib目录下JAR中的类。这样的加载机制与在OSGi

bundle中声明Bundle-Classpath很类似,不过在OSGi中会由容器来负责加载指定路径下的类。这大致阐述了这样一个JAR包能够发布服务的原因。

如果我们想要使用HTML、JSP等Web资源的话,在Controller中直接返回对应的视图就可以了。

如果我们想要将这个JAR包转换成可以在Servlet容器中部署的WAR的话,就不能依赖于Application的main函数了,而是要以类似于web.xml文件配置的方式来启动Spring应用上下文,此时我们需要声明这样一个类:

public class HelloWebXml extends SpringBootServletInitializer {

@Override

protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

return application.sources(Application.class);

}

}

这个类的作用与在web.xml中配置负责初始化Spring应用上下文的监听器作用类似,只不过在这里不需要编写额外的XML文件了。

如果要将最终的打包形式改为WAR的话,还需要对pom.xml文件进行修改,除了需要将packaging的值修改为war以外,还需要对依赖进行适当的配置(这一部分在Spring

Boot的样例和文档中均未提及,提醒大家注意):

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-tomcat

在这里需要移除对嵌入式Tomcat的依赖,这样打出的WAR包中,在lib目录下才不会包含Tomcat相关的JAR包,否则将会出现启动错误。另外,在移除对Tomcat的依赖后,为了保证编译正确,还需要添加对servlet-api的依赖,因此添加如下的配置:

org.apache.tomcat

tomcat-servlet-api

7.0.42

provided

在这里将scope属性设置为provided,这样在最终形成的WAR中不会包含这个JAR包,因为Tomcat或Jetty等服务器在运行时将会提供相关的API类。此时,执行mvn

package命令就会得到一个WAR文件,我们可以直接将其放到Tomcat下运行(需要7.0.42版本以上)。

以上介绍了基于Spring Boot开发应用的过程,目前它的文档尚不完善,但是在GitHub上有不少的样例,包括与Spring

Data集成访问数据库(关系型以及非关系型)、安全、WebSocket等,读者感兴趣可以下载运行,需要注意的是有些样例中使用的是0.5.0.M6版本,这个版本有问题,运行时会出错,建议手动修改为0.5.0.M7或快照版本。

基于以上的介绍,希望读者能够对Spring

Boot这个新项目有所了解。它简化了JAR包管理和相关基础设施环境的配置,能够帮助我们快速开发Web应用或构建REST服务,希望它能够尽快完善成熟,更多地用于实践,提升开发效率。

第二章:springboot 整合JSP(打JAR针对多模块项目)

修改以前springmvc+jsp老项目,需要重新翻新,要求用springboot+jsp打jar,遇到比较多坑,idea中运行正常启动,打成jar运行各种报404,因此总结一下。优点是将页面从项目中分离出来,解决了改动页面需要重新打包整个项目的尴尬局面。

1.新建多模块项目,创建完毕,因为是父模块,所以删掉src,然后新建2个springboot模块(springboot版本1.5.12.RELEASE ,貌似不支持2.0以上)

2.配置3个pom文件,设置模块2为主入口

模块1

模块2

项目pom

3.在模块2上新建controller,在模块1上新建service,dao,依赖于模块2,设计目的是为了将模块分离开,项目结构如下。

4.新建webapp,与模块1,2建在相同层级上

5,在模块2上新建config,修改访问jsp路径

6.修改application.yml

7.最后就可以安心的启动项目了

8.关于项目发布,只需要打包module2就可以了,打包2之前记得先install module1,然后将webapp放在同级目录即可。

SpringBoot多模块项目(Multi-Modules)

经常看到GitHub上的一些官方demo,为了展示很多功能,项目是由多模块的形式组织的,基于maven构建的形式为根文件夹下有个pom.xml,每个功能文件夹下又有pom.xml。 刚开始傻傻不会用的时候,直接引入子文件夹下的pom.xml为maven项目。然后有需要看另一个功能又打开了一个子模块,因为IDE用的是idea,变成了多窗口。后来发现直接打开父模块接可以了,各个子模块可以在同一个窗口下切换和启动。
以下最简单的建一个多模块项目,为了学习微服务,将建两个springboot web的子模块,服务提供者provider和消费者consumer。 两个服务在同个idea窗口中开发和启动,测试调用consumer的服务,consumer内部会调用provider。
new Module - > spring initializr,分别新增artifactId为provider和consumer,放在springbootmodules目录之下:

因为两个SpringBoot项目都默认是8080端口,为了能同时启动,调整consumer的端口为8081,在consumer的application.properties中添加server.port=8081
在provider和consumer分别新增两个controller: ProviderController和ConsumerController,返回最简单的字符串。 ProviderController.java:
ConsumerController中为了调用provider( http://localhost:8081/provider ),使用了spring的RestTemplate做http客户端,多配置了RestTemplate的Bean
父pom.xml现在只有管理两个子模块的作用,可以抽取子模块统一的配置信息和依赖版本控制放父模块中管理。
父pom.xml:
子模块pom.xml,设置parent为springbootmodules:
使用mvn clean package命令,或点击idea maven窗口功能,把两个子模块打成jar包:
使用java -jar命令启动两个服务:
两个服务都正常启动,并且服务消费者consumer调用服务提供者provider正常:

「开源」springboot快速开发框架推荐,接私活利器

本期为大家精选了 码云 上优秀的 Spring Boot 语言开源项目,涵盖了企业级系统框架、文件文档系统、秒杀系统、微服务化系统、后台管理系统等,希望能够给大家带来一点帮助:)
1、项目名称: 分布式敏捷开发系统架构

项目简介: 基于 Spring + SpringMVC + Mybatis 分布式敏捷开发系统架构,提供整套公共微服务服务模块:集中权限管理(单点登录)、内容管理、支付中心、用户管理(支持第三方登录)、微信平台、存储系统、配置中心、日志分析、任务和通知等,支持服务治理、监控和追踪,努力为中小型企业打造全方位J2EE企业级开发解决方案。
项目地址:https://gitee.com/shuzheng/zheng2、
2、项目名称: 模块化开发系统

项目简介: 以 SpringBoot 为中心,模块化开发系统,用户可以随意删减除权限框架外 任意的系统模块。复用,组装性强主要应用技术:
项目地址: https://gitee.com/YYDeament/88ybg
3、项目名称: JAVA 分布式快速开发平台

阅读更多 >>>  Linux虚拟机怎么添加文件夹

项目简介: JAVA 分布式快速开发平台:SpringBoot,SpringMVC,Mybatis,mybatis-plus,motan/dubbo分布式,Redis 缓存,Shiro 权限管理,Spring-Session 单点登录,Quartz 分布式集群调度,Restful 服务,QQ/微信登录,App token 登录,微信/支付宝支付;日期转换、数据类型转换、序列化、汉字转拼音、身份证号码验证、数字转人民币、发送短信、发送邮件、加密解密、图片处理、excel 导入导出、FTP/SFTP/fastDFS 上传下载、二维码、XML 读写、高精度计算、系统配置工具类等。
项目地址:https://gitee.com/iBase4J/iBase4J
4、项目名称: 快速开发框架 ThinkGem
项目地址: https://gitee.com/thinkgem/jeesite
5、项目名称: Java 快速开发平台 MCMS

项目简介: 完整开源,Java 快速开发平台。基于 Spring、SpringMVC、Mybatis 架构,MStore 提供更多好用的插件与模板(文章、商城、微信、论坛、会员、评论、支付、积分、工作流、任务调度等,同时提供上百套免费模板任意选择),价值源自分享!铭飞系统不仅一套简单好用的开源系统、更是一整套优质的开源生态内容体系。
项目地址: https://gitee.com/mingSoft/MCMS
6、项目名称: 分布式秒杀系统

项目简介: 可能秒杀架构原理大家都懂,网上也有不少实现方式,但大多都是文字的描述,告诉你如何如何,什么加锁、缓存、队列之类。但很少全面有的案例告诉你如何去做,既然是从0到1,希望以下代码案例可以帮助到你。当然最终落实到生产,还有很长的路要走,要根据自己的业务进行编码,实施并部署。你将会在代码案例中学到以下知识:
项目地址: https://gitee.com/52itstyle/spring-boot-seckill
7、项目名称: Spring Boot 快速开发平台
项目简介: renren-fast 是一个轻量级的 Spring Boot 快速开发平台,其设计目标是开发迅速、学习简单、轻量级、易扩展;使用 Spring Boot、Shiro、MyBatis、Redis、Bootstrap、Vue2.x 等框架,包含:管理员列表、角色管理、菜单管理、定时任务、参数管理、代码生成器、日志管理、云存储、API 模块(APP 接口开发利器)、前后端分离等。
项目地址: https://gitee.com/babaio/renren-fast
8、项目名称: 企业级快速开发脚手架

项目简介: 本项目是 spring boot 搭建的一个企业级快速开发脚手架。其技术栈如下所示:
项目地址: https://gitee.com/jamen/slife
9、项目名称: 文件文档在线预览

项目简介: 此项目为使用 spring boot 打造文件文档在线预览项目解决方案,对标业内付费产品有【永中office】【office365】【idocv】等,在取得公司高层同意后以Apache协议开源出来反哺社区,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如 doc、docx、Excel、pdf、txt、zip、rar、图片等等。
项目地址: https://gitee.com/kekingcn/file-online-preview
10、项目名称: 微服务化开发平台

项目简介: Cloud-Admin 是国内首个基于 Spring Cloud 微服务化开发平台,核心技术采用 Spring Boot2 以及 Spring Cloud Gateway 相关核心组件,前端采用 vue-element-admin 组件。具有统一授权、认证后台管理系统,其中包含具备用户管理、资源权限管理、网关 API 管理等多个模块,支持多业务系统并行开发,可以作为后端服务的开发脚手架。代码简洁,架构清晰,适合学习和直接项目中使用。
项目地址: https://gitee.com/minull/ace-security
11、项目名称: 后台管理系统 Guns

项目简介: Guns 基于 SpringBoot,致力于做更简洁的后台管理系统,完美整合 springmvc + shiro + mybatis-plus + beetl。Guns 项目代码简洁,注释丰富,上手容易,同时 Guns 包含许多基础模块(用户管理,角色管理,部门管理,字典管理等10个模块),可以直接作为一个后台管理系统的脚手架。Guns v3.0 新增 rest api 服务,提供对接服务端接口的支持,并利用 jwt token 鉴权机制给予客户端的访问权限,传输数据进行 md5 签名保证传输过程数据的安全性!
项目地址: https://gitee.com/naan1993/guns

SpringBoot整合ORM开发框架MyBatis和JPA

1、在使用Spring整合ORM组件的过程中,为了达到简化的目的,往往会进行大量的配置。利用SpringBoot可以进一步实现配置的简化。SpringBoot整合MyBatis开发框架,MyBatis是一款常用并且配置极为简单的ORM开发框架。其与Spring结合后,可以利用Spring的特征实现DAO接口的自动配置。在SpringBoot中,又对MyBatis框架的整合进行了进一步简化。

修改pom.xml配置文件,在项目中引入mybatis-spring-boot- starter依赖支持库,切记也需要数据库链接池的支持的哦。

数据表结构,如下所示:

注意:如果数据表字段两个英文单词之间是下划线连接的,但是你的实体类是驼峰命名法,此时就需要进行配置,数据库字段是你下划线分隔,但是bean中的字段是驼峰命名的,如user_name和userName,导致无法匹配。如果是通过xml文件来配置的话,只需要开启驼峰命名转换,setting name="mapUnderscoreToCamelCase" value="true"/>,在/src/main/resources/mybatis/mybatis.cfg.xml里面配置即可。

创建一个po实体类,方便数据传输,如下所示:

在src/main/resources目录中创建mybatis/mybatis.cfg.xml配置文件。如果要开启驼峰命名转换,在这里开启即可,如下所示:

如果在application.properties中开启转换的话,使用mybatis.configuration.map-underscore-to-camel-case=true配置即可。

或者搞个配置类,如果数据库表字段Column无法自动映射到相对应的实体类属性上,我们可以在config包下新建一个自动配置类MybatisConfig,开始驼峰命名规则。

MyBatis配置文件开启驼峰命名映射

修改application.yml配置文件,追加MyBatis配置,如下所示:

搞几个Dao层、Service层、Controller层的接口或者类,如下所示:

注意:如果不想每次都在mapper接口上添加@Mapper注解,可以在主启动类上通过添加@MapperScan注解来批量扫描指定包下的所有mapper接口。

Service层的接口和实现类代码,如下所示:

控制层的代码,如下所示:

项目启动类,如下所示:

通过Postman测试一下,自己写的接口,看看好使不,如下所示:

项目结构,如下所示:

2、JPA是官方推出的Java持久层操作标准(现主要使用Hibernate实现),使用SpringData技术和JpaRepository接口技术,也可以达到简化数据层的目的。要在SpringBoot中使用SpringDataJPA,需要spring-boot-starter-data-jpa依赖库的支持。

修改pom.xml配置文件,引入相关依赖包,如下所示:

创建UserInfo实体类,如下所示:

创建UserDao,然后继承JpaRepository ,此时就可以使用写好的方法了,不用自己再额外写接口和实现,如下所示:

然后定义Service接口和Service接口实现,如下所示:

然后搞一个Controller,作为接口访问的入口,如下所示:

修改程序启动主类,追加Repository扫描配置。如果使用JpaRepository实现了DAO接口的自动实现。需要注意的是,如果想启用Repository配置,则需要在程序启动主类时使用@EnableJpaRepositories注解配置扫描包,而后才可以正常使用。

修改application.properties,使用Druid作为数据源连接池,如下所示:

使用postman进行接口调用,如下所示:

最主要的是给自己增加知识的储备,有备无患。最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(666)领取,祝大家更上一层楼!!!

SpringBoot - resource资源文件的打包配置详解(指定资源文件位置)

(1)默认 Spring Boot 项目结构,资源文件放置在 src/main/resources 中,测试的资源文件在 src/test/resources 中。

src/main/resources 与 src/test/resources 的区别:

(2)将项目打包后,解压 jar 可以发现原先 src/main/resources 目录下的资源文件已经被打包进来了:

(3)但有时我们的资源文件并不一定是放在 src/main/resources 目录下,比如我的项目通常会将资源文件放在 src/test/resources 目录下:

原因:根据实践经验表明,测试完后的配置项是最完整的,且经常会忘记替换正式版参数,因而选择将配置文件全部放置在 src/test/resources 目录下。

(4)又比如 mybatis 的 mapper.xml 文件,我们习惯把它和 Mapper.java 放一起

(5)但上面这两种情况的资源文件,在使用 maven 打包时是不会被打包进 jar 的。这时候我们便要指定需要打包的资源文件,这个有如下两种方法可以实现。

(1)

标签位于

标签内,用于指定项目资源文件的位置。比如下面配置我们指定了 src/test/resources 也是资源文件目录:

(2)而对于写在包下的 Mapper.xml 文件,我们则可以通过如下配置指明资源文件位置:

提示:其中 * / 这样的写法,是为了保证各级子目录下的资源文件被打包。

(3)我们还可以通过 excludes 标签剔除不需要的资源:

(1)除了使用

标签外,我们也可以使用 maven-resources-plugin 插件实现同样的目的。比如下面配置把 src/test/resources 目录下的资源文件打包到 classes 目录下:

(2)而对于写在包下的 Mapper.xml 文件,我们也可以通过 maven-resources-plugin 插件将其打包到相应位置:

(3)使用 maven-resources-plugin 插件时,我们同样可以通过 excludes 标签剔除不需要的资源:

Spring Boot 构建多租户SaaS平台核心技术指南

1. 概述
笔者从2014年开始接触SaaS(Software as a Service),即多租户(或多承租)软件应用平台;并一直从事相关领域的架构设计及研发工作。机缘巧合,在笔者本科毕业设计时完成了一个基于SaaS的高效财务管理平台的课题研究,从中收获颇多。最早接触SaaS时,国内相关资源匮乏,唯一有的参照资料是《互联网时代的软件革命:SaaS架构设计》(叶伟等著)一书。最后课题的实现是基于OSGI(Open Service Gateway Initiative)Java动态模块化系统规范来实现的。
时至今日,五年的时间过去了,软件开发的技术发生了巨大的改变,笔者所实现SaaS平台的技术栈也更新了好几波,真是印证了那就话:“山重水尽疑无路,柳暗花明又一村”。基于之前走过的许多弯路和踩过的坑,以及近段时间有许多网友问我如何使用Spring Boot实现多租户系统,决定写一篇文章聊一聊关于SaaS的硬核技术。
说起SaaS,它只是一种软件架构,并没有多少神秘的东西,也不是什么很难的系统,我个人的感觉,SaaS平台的难度在于商业上的运营,而非技术上的实现。就技术上来说,SaaS是这样一种架构模式:它让多个不同环境的用户使用同一套应用程序,且保证用户之间的数据相互隔离。现在想想看,这也有点共享经济的味道在里面。
笔者在这里就不再深入聊SaaS软件成熟度模型和数据隔离方案对比的事情了。今天要聊的是使用Spring Boot快速构建独立数据库/共享数据库独立Schema的多租户系统。我将提供一个SaaS系统最核心的技术实现,而其他的部分有兴趣的朋友可以在此基础上自行扩展。
2. 尝试了解多租户的应用场景
假设我们需要开发一个应用程序,并且希望将同一个应用程序销售给N家客户使用。在常规情况下,我们需要为此创建N个Web服务器(Tomcat),N个数据库(DB),并为N个客户部署相同的应用程序N次。现在,如果我们的应用程序进行了升级或者做了其他任何的改动,那么我们就需要更新N个应用程序同时还需要维护N台服务器。接下来,如果业务开始增长,客户由原来的N个变成了现在的N+M个,我们将面临N个应用程序和M个应用程序版本维护,设备维护以及成本控制的问题。运维几乎要哭死在机房了…
为了解决上述的问题,我们可以开发多租户应用程序,我们可以根据当前用户是谁,从而选择对应的数据库。例如,当请求来自A公司的用户时,应用程序就连接A公司的数据库,当请求来自B公司的用户时,自动将数据库切换到B公司数据库,以此类推。从理论上将没有什么问题,但我们如果考虑将现有的应用程序改造成SaaS模式,我们将遇到第一个问题:如果识别请求来自哪一个租户?如何自动切换数据源?
3. 维护、识别和路由租户数据源
我们可以提供一个独立的库来存放租户信息,如数据库名称、链接地址、用户名、密码等,这可以统一的解决租户信息维护的问题。租户的识别和路由有很多种方法可以解决,下面列举几个常用的方式:
解决了上述问题后,我们再来看看如何获取客户端传入的租户信息,以及在我们的业务代码中如何使用租户信息(最关键的是DataSources的问题)。
我们都知道,在启动Spring Boot应用程序之前,就需要为其提供有关数据源的配置信息(有使用到数据库的情况下),按照一开始的需求,有N个客户需要使用我们的应用程序,我们就需要提前配置好N个数据源(多数据源),如果N<50,我认为我还能忍受,如果更多,这样显然是无法接受的。为了解决这一问题,我们需要借助Hibernate 5提供的动态数据源特性,让我们的应用程序具备动态配置客户端数据源的能力。简单来说,当用户请求系统资源时,我们将用户提供的租户信息(tenantId)存放在ThreadLoacal中,紧接着获取TheadLocal中的租户信息,并根据此信息查询单独的租户库,获取当前租户的数据配置信息,然后借助Hibernate动态配置数据源的能力,为当前请求设置数据源,最后之前用户的请求。这样我们就只需要在应用程序中维护一份数据源配置信息(租户数据库配置库),其余的数据源动态查询配置。接下来,我们将快速的演示这一功能。
4. 项目构建
我们将使用Spring Boot 2.1.5版本来实现这一演示项目,首先你需要在Maven配置文件中加入如下的一些配置:
然后提供一个可用的配置文件,并加入如下的内容:
接下来,我们需要关闭Spring Boot自动配置数据源的功能,在项目主类上添加如下的设置:
最后,让我们看看整个项目的结构:

阅读更多 >>>  cad的临时文件在哪里

5. 实现租户数据源查询模块
我们将定义一个实体类存放租户数据源信息,它包含了租户名,数据库连接地址,用户名和密码等信息,其代码如下:
持久层我们将继承JpaRepository接口,快速实现对数据源的CURD操作,同时提供了一个通过租户名查找租户数据源的接口,其代码如下:
业务层提供通过租户名获取租户数据源信息的服务(其余的服务各位可自行添加):
接下来是配置自定义的数据源,其源码如下:
在改配置类中,我们主要提供包扫描路径,实体管理工程,事务管理器和数据源配置参数的配置。
6. 实现租户业务模块
在此小节中,租户业务模块我们仅提供一个用户登录的场景来演示SaaS的功能。其实体层、业务层和持久化层根普通的Spring Boot Web项目没有什么区别,你甚至感觉不到它是一个SaaS应用程序的代码。
首先,创建一个用户实体User,其源码如下:
业务层提供了一个根据用户名检索用户信息的服务,它将调用持久层的方法根据用户名对租户的用户表进行检索,如果找到满足条件的用户记录,则返回用户信息,如果没有找到,则返回null;持久层和业务层的源码分别如下:
7. 配置拦截器
我们需要提供一个租户信息的拦截器,用以获取租户标识符,其源代码和配置拦截器的源代码如下:
8. 维护租户标识信息
在这里,我们使用ThreadLocal来存放租户标识信息,为动态设置数据源提供数据支持,该类提供了设置租户标识、获取租户标识以及清除租户标识三个静态方法。其源码如下:
9. 动态数据源切换
要实现动态数据源切换,我们需要借助两个类来完成,CurrentTenantIdentifierResolver和AbstractDataSourceBasedMultiTenantConnectionProviderImpl。从它们的命名上就可以看出,一个负责解析租户标识,一个负责提供租户标识对应的租户数据源信息。
首先,我们需要实现CurrentTenantIdentifierResolver接口中的resolveCurrentTenantIdentifier()和validateExistingCurrentSessions()方法,完成租户标识的解析功能。实现类的源码如下:
有了租户标识符解析类之后,我们需要扩展租户数据源提供类,实现从数据库动态查询租户数据源信息,其源码如下:
最后,我们还需要提供租户业务模块数据源配置,这是整个项目核心的地方,其代码如下:
10. 应用测试
最后,我们通过一个简单的登录案例来测试本次课程中的SaaS应用程序,为此,需要提供一个Controller用于处理用户登录逻辑。在本案例中,没有严格的对用户密码进行加密,而是使用明文进行比对,也没有提供任何的权限认证框架,知识单纯的验证SaaS的基本特性是否具备。登录控制器代码如下:
在启动项目之前,我们需要为主数据源创建对应的数据库和数据表,用于存放租户数据源信息,同时还需要提供一个租户业务模块数据库和数据表,用来存放租户业务数据。一切准备就绪后,启动项目,在浏览器中输入:http://localhost:8080/login.html

在登录窗口中输入对应的租户名,用户名和密码,测试是否能够正常到达主页。可以多增加几个租户和用户,测试用户是否正常切换到对应的租户下。
总结

网站数据信息

"springboot项目结构,「开源」springboot快速开发框架推荐,接私活利器"浏览人数已经达到20次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:springboot项目结构,「开源」springboot快速开发框架推荐,接私活利器的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!