美文网首页
springBoot01----2019-05-16

springBoot01----2019-05-16

作者: coderymy | 来源:发表于2019-06-20 11:59 被阅读0次

一,springboot简介

1,简介

简化spring应用开发的一个框架

整个spring技术栈的一个大整合

J2EE开发的一站式解决方案

2,微服务

martin fowler 2014发表了一篇微服务的博客,这个时候微服务才慢慢的被人所熟知

什么是微服务?

解释的是当我们开发一个应用时,这个应用应该是作为我们一系列小服务的组合

一个应用应该是一个小型服务,可以通过http的方式进行互通

传统的单体应用,在开发和部署都和简单,但是当修改时,可能会带来很多的麻烦,一个大型应用这样使用就太麻烦

[图片上传失败...(image-d5101c-1557995679911)]

每一个功能元素最后都是一个可独立替换独立生成的单元,但是相对的,太多的单个元素直接互调会带来很多的麻烦,所以这个时候使用springcloud来进行分布式的互调,这样spring就提供了一站式的开发

[图片上传失败...(image-b1dcaa-1557995679911)]

3,优点

  • 快速创建独立运行的spring项目以及主流框架集成(也就是说,可以简化那些之前学习ssm时的框架的配置,以及快速开发)

  • 有内嵌的servlet容器,应用无需打成war包,(直接打成jar包,用java -jar就可以运行)

  • starters自动依赖与版本控制,这样可以简化操作,需要使用什么技术的相关功能直接导入对应的starters即可,同样的可以直接来管理版本的内容

  • 大量的自动配置,用户不需要太多的进行相关技术之间的整合信息,可以做到开箱即用,当然也可通过自己的配置来完成一些需求

  • 无需配置XML文件,无代码生成,开箱即用

  • 准生产环境的运行时应用监控

  • 与云计算的天然集成

4,缺点

入门容易,精通难,spring框架底层的api很麻烦

二,springboot的helloworld

实战

  1. 首先使用maven创建一个项目

  2. 添加入springboot的依赖

  3. 创建一个类名(与下面启动一样HelloWorldMainApplication),添加上@SpringBootApplication的注解

  4. 在该类中创建一个main方法,然后添加上一段代码

    <pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n44" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit;"> SpringApplication.run(HelloWorldMainApplication.class,args);</pre>

  5. 编写相关的Controller之类的

  6. 部署,导入一个maven插件(spring-boot-maven-plugin),使用maven中的package打包,然后在对应的地方可以直接将 他找到,使用java -jar的方式启动这个jar包文件

解析

1,POM文件

1,父项目

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="xml" cid="n52" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/>
</parent>
它的父项目是
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
在这个依赖里面,可以看到所有的springboot的所有依赖版本
所以称为springBoot版本仲裁中心,以后我们导入依赖默认是不需要写版本 </pre>

2,导入依赖

有一个spring-boot- starter-web这个依赖,这个依赖导入依赖一些其他的依赖,所以也就是说吗,这个东西帮我们导入了很多需要web开发的依赖

springBoot将所有的功能场景都抽取出来,做成一个个的starter(启动器),只需要在项目中引入这些starter相关场景的所有依赖都会导入进来,需要使用什么功能就导入什么功能

springboot启动器

3,主程序

首先是需要@SpringBootApplication将该注解标记在某一个类上,说明这个类是springBoot的主配置类,表示运行这个类的main方法就可以启动springBoot应用

@SpringBootApplication是一个组合的注解

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="java" cid="n60" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> @SpringBootConfiguration
这个是配置内的注解,也就是之前我们使用配置文件进行配置,现在使用配置内可以使该容器具有配置文件一样的效果
@EnableAutoConfiguration
这个是开启自动配置功能,包扫描,开启mapper之类的一些东西
自动配置的原理在于它也是一个组合的组件,里面也有很多注解
详解可以看关于spring注解的解释</pre>

快速创建

具体使用方式不解释了,简单的使用就完了

只需要选择我们需要的模块,然后自动联网下载需要的文件

其中有些文件暂时没有用

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n66" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> .mvn文件夹
.gitgnore
mvnw
mvnw.cmd</pre>

默认生成的springBoot项目有几个特点

  1. 主程序生成好了,我们只需要关注自己的业务逻辑就完事了

  2. resources文件夹中的目录

    1. static,保存所有的静态资源,js,css,images

    2. templates,保存所有的模板页面;(springBoot默认jar包使用内嵌的tomcat,默认不支持jsp页面);可以使用模板引擎(freemarker,thymeleaf);

    3. application.properties,springBoot应用的配置(可以修改springBoot的默认配置,例如需要修改端口号,就可以在这个文件中使用server.port=8081的方式修改)


三,SpringBoot的配置

1,配置文件

SpringBoot可以使用两种方式创建配置文件,一种是application.properties和application.yml

2,YAML语法

YAML(YAML Ain't Markip Language)

可以说是一种标记语言,也可以说不是一种标记语言

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n88" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> 对于上面properties的方式修改端口号
yaml是写成这个样子的
server:
port: 8081</pre>

1,基本语法

k:(空格)v:表示一对键值对(空格必须有),以空格的缩进来控制层级关系,只要是左对齐的一列数据,都是同一层级的

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n91" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> server:
port: 8080
path: /hello
注意空格</pre>

2,值的写法

字面量:普通的值(数字,字符串,布尔)

使用类似k:v:字面量的形式来直接写

字符串默认不加上单引号或者双引号(有特殊含义)

“”:双引号,会转义字符串中的特殊字符,特殊字符会作为本身要表达的意思,也就是说“/n”是换行的意思

‘’:单引号,不会转义特殊字符,也就是说“/n”是字符串的意思

对象,map(属性和值)(键值对)

k: v:在下一行来写对象的属性和值的关系,注意缩进

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n100" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> friends:
lastName: zhangsan
age: 20
还是要注意:后的空格</pre>

行内写法

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n102" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> friends:{lastName: zhangsan,age: 19}</pre>

数组(List ,Set)

使用-值表示数组中的一个元素

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n105" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> pets:

  • cat
  • dog
  • pig
    这个地方是,空格-空格值</pre>

行内写法

<pre spellcheck="false" class="md-fences md-end-block md-fences-with-lineno ty-contain-cm modeLoaded" lang="" cid="n107" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 0px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"> pets: [cat,dog,pig]</pre>

3,将配置文件中的值映射到组件中

在需要映射到的类上加上@ConfigurationProperties(prefix="")其中写的参数是对应的那歌映射文件中的对应的那个下面的所有属性

可以导入一个配置文件处理器,这个时候配置文件进行绑定就会有提示

spring-boot-configuration-processor这个依赖

需要注意的是,编写的映射类需要是容器中的组件,才能容器提供那个注解,所以需要在@ConfigurationProperties注解之前加上@Component注解

可以使用test中进行单元测试,可以在测试期间,类似编码一样进行自动注入的方式

properties的使用

语法自学,一般都是.的形式

需要注意的是properties需要修改编码的问题,在file中修改就完事了

使用@Value(“”)来获取值,具体写法再议,不建议使用

@ConfigurationProperties @Value
功能 批量注入配置文件属性 单个指定
松散绑定(语法) 支持 不支持
spEL 不支持 支持
JSR303校验 支持 不支持
复杂类型 支持 不支持

松散语法:javaBean中last-name(或者lastName) -->application.properties中的last-name;

spEL语法:#{11*2}

JSR303:@Value会直接忽略,校验规则

@PropertySource和@ImportResource

@PropertySource加载指定的配置文件;也就是说,对于需要映射值的类,可能它的那个映射yaml文件并不是全局的配置文件,这个时候就需要使用这个注解来

[图片上传失败...(image-85279e-1557995679910)]

也就是说,对于上面的@ConfigurationProperties只能加载核心配置文件,也就是application.yml/properties,但是@PropertySource可以加载指定的配置文件,使用类路径的形式加载进去

@ImportResource作用是导入spring的配置文件,让配置文件中的内容生效,也就是之前写spring配置文件时的形式,使用这个注解可以将对应的文件映射到该类上,也是使用类路径的形式导入

SpringBoot推荐给容器添加组件的方式:

1、配置类=====Spring的xml配置文件(old)

2、全注解方式@Configuration+@Bean(new)(推荐)

4,配置文件使用占位符

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="" cid="n157" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">也就是使用
${}的形式给对应的值赋值
</pre>

5,Profile

1, 多Profile文件

我们在编写主配置文件时,配置文件的文件名可以是

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="" cid="n161" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">application-{profile}.properties/yml

</pre>

比如我创建了application.yml,application-dev.yml和application-prod.yml用于在不同的开发周期中使用不同的配置文件

也就是说我们可以创建多个配置文件,但是默认使用的是application.properties/yml

但是何时我们的其他配置文件可以生效呢?

2,激活指定profiles文件


1,也就是可以在application.yml(核心配置文件)中使用一条语句

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="yaml" cid="n168" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">spring:
profiles:
active: dev

properties的写法是spring.profiles.active=dev
</pre>

这样这个时候就可以激活使用对应的application-dev.yml配置文件

2,yaml有一个特性是多行文版块的形式,这样就不需要创建多个yaml文件,直接选择激活哪个文版块就完事了,不同的文版块使用“---”隔开,对文版块使用语句定义不同文版块的名称

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="" cid="n171" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">server:
port: 8080
spring:
profiles:
active: dev


server:
port: 8081
spring:
profiles: dev


server:
port: 8082
spring:
profiles: prod
</pre>

使用这种方式定义和激活对应的文版块

3,使用命令行的形式激活

用处不大,待续

使用方式,也就是打成jar包之后在cmd中打开jar时使用

<pre spellcheck="false" class="md-fences mock-cm md-end-block md-fences-with-lineno" lang="" cid="n176" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: pre-wrap; background-image: inherit; background-position: inherit; background-size: inherit; background-repeat: inherit; background-attachment: inherit; background-origin: inherit; background-clip: inherit; background-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px 8px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">java -jar 文件名 --spring.profiles.active=dev(激活模块)
</pre>

4,虚拟机参数

待续

相关文章

  • springBoot01----2019-05-16

    一,springboot简介 1,简介 简化spring应用开发的一个框架 整个spring技术栈的一个大整合 J...

网友评论

      本文标题:springBoot01----2019-05-16

      本文链接:https://www.haomeiwen.com/subject/isniaqtx.html