各位志同道合的朋友们大家好,我是一个一直在一线互联网踩坑十余年的编码爱好者,现在将我们的各种经验以及架构实战分享出来,如果大家喜欢,就关注我,一起将技术学深学透,我会每一篇分享结束都会预告下一专题
Spring Boot 来自于 Spring 大家族,是 Spring 官方团队(Pivotal 团队)提供的全新框架,它的诞生解决了 Spring 框架使用较为繁琐的问题。Spring Boot 的核心思想是约定优于配置,让开发人员不需要配置任何 XML 文件,就可以像 Maven 整合 Jar 包一样,整合并使用所有框架。
Spring Boot 特性
Spring Boot 2 对系统环境的要求
在开始之前,我们先来创建一个Spring Boot 项目。
Spring Boot 有两种快速创建的方式:Spring 官网在线网站创建和 IntelliJ IDEA 的 Spring Initializr 创建,下面分别来看。
创建 Spring Boot 项目
1)在线网站创建
在浏览器输入 https://start.spring.io,页面打开如下图所示:
填写相应的项目信息,选择对应的 Spring Boot 和 Java 版本点击 “Generate the project”按钮下载项目压缩文件,解压后用 IDEA 打开即可。
其中 Group 和 Artifact 是 Maven 项目用来确认依赖项目的标识,比如:
‹dependency›
‹groupId›org.springframework‹/groupId›
‹artifactId›spring-core‹/artifactId›
‹version›4.1.6.RELEASE‹/version›
‹/dependency›
Group 对应的是配置文件的 groupId,相当于项目的包名;而 Artifact 对应的是配置文件的 artifactId,相当于项目名。
2)使用 IntelliJ IDEA 创建
① 新建项目 → 选择 Spring Initialzr,如下图所示:
② 点击 Next 按钮,填写对应的项目信息(和在线网站创建的字段基本相同),如下图所示:
③ 点击 Next 按钮,选择相应的依赖信息,如下图所示:
④ 点击 Next 按钮,选择项目保存的路径,点击 Finish 创建项目完成,如下图所示:
创建一个 Web 应用
1)pom.xml 中添加 Web 模块的依赖,如下所示:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-web‹/artifactId›
‹/dependency›
2)创建后台代码
import org.springframework.web.bind.annotation.RequestMApping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/index")
public String index(String name) {
return "Hello, " + name;
}
}
3)启动并访问项目
项目的启动类是标识了 @Spring BootApplication 的类,代码如下所示:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class SpringbootlearningApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootlearningApplication.class, args);
}
}
启动并访问 http://localhost:8080/index?name=laowang 效果如下:
到目前为止 Spring Boot 的项目就创建并正常运行了。
设置配置文件
Spring Boot 的配置文件,是 resources 目录下 application.properties 文件,如下图所示:
可以在配置文件中设置很多关于 Spring 框架的配置,格式如下配置所示:
# 项目运行端口
server.port=8086
# 请求编码格式
server.tomcat.uri-encoding=UTF-8
Spring Boot 的其他功能开发和 Spring 相同(Spring Boot 2 是基于 Spring Framework 5 构建的),本文就不过多的介绍了,感兴趣的朋友可以点击这里查看
Spring Boot 项目的发布方式有两种:
内置容器运行
1)打包应用
使用窗口命令,在 pom.xml 同级目录下:
mvn clean package -Dmaven.test.skip=true
Dmaven.test.skip=true 表示不执行测试用例,也不编译测试用例类。
2)启动应用
后台启动 Java 程序, 命令如下:
nohup java -jar springbootlearning-0.0.1-SNAPSHOT.jar &
停止程序
首先查询 Java 程序的 pid
ps -ef|grep java
再停止程序
kill -9 pid
操作如下图所示:
扩展内容
指定程序运行日志文件
nohup java -jar springbootlearning-0.0.1-SNAPSHOT.jar 1››logs 2››errlog &
其中:
外置容器(Tomcat)运行
1)排除内置 Tomcat
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-tomcat‹/artifactId›
‹scope›provided‹/scope›
‹/dependency›
将 scope 属性设置为 provided,表示打包不会包含此依赖。
2)配置启动类
在项目的启动类中继承 Spring BootServletInitializer 并重写 configure() 方法:
@SpringBootApplication
public class PackageApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(PackageApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(PackageApplication.class, args);
}
}
3)打包应用
使用窗口命令,在 pom.xml 同级目录下:
mvn clean package -Dmaven.test.skip=true
4)部署应用
打包完成会在 target 目录下生成:项目名 + 版本号.war 文件,复制到 Tomcat 的 webapps 目录下,运行 Tomcat 即可。
1.Spring Boot 2.0 支持最低的 JDK 版本是?
A:JDK 6B:JDK 7C:JDK 8D:JDK 9
答:C
2.Spring、Spring Boot、Spring Cloud 是什么关系?
答:它们都是来自于 Spring 大家庭,Spring Boot 是在 Spring 框架的基础上开发而来,让更加方便使用 Spring;Spring Cloud 是依赖于 Spring Boot 而构建的一套微服务治理框架。
3.Spring Boot 项目有哪些优势?
答:Spring Boot 项目优势如下:
4.如何将 Spring Boot 项目打包成 war 包?
答:在 pom.xml 里设置 ‹packaging›war‹/packaging› 。
5.在 Maven 项目中如何修改打包名称?
答:在 pom.xml 文件的 build 节点中,添加 finalName 节点并设置为要的名称即可,配置如下:
‹build›
‹finalName›warName‹/finalName›
‹/build›
6.Ant、Maven、Gradle 有什么区别?
答:Ant、Maven、Gradle 是 Java 领域中主要有三大构建工具,它们的区别如下:
Spring Boot 官方支持 Maven 和 Gradle 作为项目构建工具。Gradle 虽然有更好的理念,但是相比 Maven 来讲其行业使用率偏低,并且 Spring Boot 官方默认使用 Maven。
7.Maven 如何设置发布的包名?
答:在 build 节点下设置 finalName 就是发布的包名,如下代码所示:
‹build›
‹finalName›biapi‹/finalName›
‹/build›
8.Spring Boot 热部署有几种方式?
答:Spring Boot 热部署主要有两种方式:Spring Loaded、Spring-boot-devtools。
方式 1:Spring Loaded
在 pom.xml 文件中添加如下依赖:
‹plugin›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-maven-plugin‹/artifactId›
‹dependencies›
‹dependency›
‹groupId›org.springframework‹/groupId›
‹artifactId›springloaded‹/artifactId›
‹version›1.2.6.RELEASE‹/version›
‹/dependency›
‹/dependencies›
‹configuration›
‹mainClass›此处为入口类‹/mainClass›
‹/configuration›
‹/plugin›
方式 2:Spring-boot-devtools
在 pom.xml 文件中添加如下依赖:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-devtools‹/artifactId›
‹scope›provided‹/scope›
‹optional›true‹/optional›
‹/dependency›
9.Spring Boot 2.0 可以在 Tomcat 7 运行吗?为什么?
答:Spring Boot 2.0 无法在 Tomcat 7 上运行。因为 Spring Boot 2.0 使用的是 Spring Framework 5,Spring Framework 5 使用的是 Servlet 3.1,而 Tomcat 7 最高支持到 Servlet 3.0,所以 Spring Boot 2.0 无法在 Tomcat 7 上运行。
10.如何使用 Jetty 代替 Tomcat?
答:在 spring-boot-starter-web 移除现有的依赖项,添加 Jetty 依赖,配置如下:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-web‹/artifactId›
‹exclusions›
‹exclusion›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-tomcat‹/artifactId›
‹/exclusion›
‹/exclusions›
‹/dependency›
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-jetty‹/artifactId›
‹/dependency›
11.Spring Boot 不支持以下哪个内嵌容器?
A:TomcatB:JettyC:UndertowD:Nginx
答:D
题目解析:Jetty 容器支持如下:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-web‹/artifactId›
‹exclusions›
‹exclusion›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-tomcat‹/artifactId›
‹/exclusion›
‹/exclusions›
‹/dependency›
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-jetty‹/artifactId›
‹/dependency›
Undertow 容器支持如下:
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-web‹/artifactId›
‹exclusions›
‹exclusion›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-tomcat‹/artifactId›
‹/exclusion›
‹/exclusions›
‹/dependency›
‹dependency›
‹groupId›org.springframework.boot‹/groupId›
‹artifactId›spring-boot-starter-undertow‹/artifactId›
‹/dependency›
12.Spring Boot 中配置文件有几种格式?
答:Spring Boot 中有 .properties 和 .yml 两种配置文件格式,它们主要的区别是书写格式不同。
.properties 配置文件格式如下:
app.user.name = hellojava
.yml 配置文件格式如下:
app:
user:
name: hellojava
13.项目中有两个配置 application.properties 和 application.yml,以下说法正确的是?
A:application.properties 的内容会被忽略,只会识别 application.yml 的内容。B:两个配置文件同时有效,有相同配置时,以 application.properties 文件为主。C:application.yml 的内容会被忽略,只会识别 application.properties 的内容。D:两个配置文件同时有效,有相同配置时,以 application.yml 文件为主。
答:B
14.RequestMapping 和 GetMapping 有什么不同?
答:RequestMapping 和 GetMapping 区别如下:
15.以下关于 @RestController 和 @Controller 说法正确的?
A:@Controller 返回 JSON 数据B:@RestController 返回 JSON 数据C:@APIController 返回 JSON 数据D:以上都对
答:B
16.Spring Cache 常用的缓存注解有哪些?
答:Spring Cache 常用注解如下:
17.Spring Boot Admin 和 Spring Boot Actuator 的关系是什么?
答:Spring Boot Admin 使用了 Spring Boot Actuator 接口进行 UI 美化封装的监控工具,它以图形化的方式查询单个应用的详细状态,也可以使用 Spring Boot Admin 来监控整个集群的状态。
18.如何理解 Spring Boot 中的 Stater?
答:Stater 可以理解为启动器,它是方便开发者快速集成其他框架到 Spring 中的一种技术。比如,spring-boot-starter-data-jpa 就是把 JPA 快速集成到 Spring 中。
19.常见的 starter 有哪些?
答:常见的 starter 如下:
20.Spring Boot Starter JDBC 和 Spring JDBC 有什么关系?
答:spring-boot-starter-jdbc 是 Spring Boot 针对 JDBC 的使用提供了对应的 Starter 包,在 Spring JDBC 上做了进一步的封装,方便在 Spring Boot 生态中更好的使用 JDBC。
21.Spring Boot 有哪几种读取配置的方式?
答:Spring Boot 可以通过 @Value、@Environment、@ConfigurationProperties 这三种方式来读取。
例如,配置文件内容如下:
app.name=中文
① Value 方式
@Value("${app.name}")
private String appName;
② Environment 方式
public class HelloController {
@Autowired
private Environment environment;
@RequestMapping("/index")
public String index(String hiName) {
// 读取配置文件
String appName = environment.getProperty("app.name");
return "Hello, " + hiName + " |@" + appName;
}
}
③ ConfigurationProperties 方式
@ConfigurationProperties(prefix = "app")
public class HelloController {
// 读取配置文件,必须有 setter 方法
private String name;
public void setName(String name) {
this.name = name;
}
@RequestMapping("/index")
public String index(String hiName) {
System.out.println("appname:" + name);
return "Hello, " + hiName + " |@" + appName;
}
}
22.使用 @Value 读取中文乱码是什么原因?如何处理?
答:这是因为配置文件的编码格式导致的,需要把编码格式设置为 UTF-8,如下图所示:
设置完成之后,重新启动 IDEA 就可以正常显示中文了。
通过本文我们学习了 Spring Boot 的两种创建方式:在线网站创建和 IntelliJ IDEA 方式创建。知道了 Spring Boot 发布的两种方式:内置容器和外置 Tomcat,知道了 Spring Boot 项目特性,以及配置文件 .properties 和 .yml 的差异,掌握了读取配置文件的三种方式:@Value、@Environment、@ConfigurationProperties。
下一篇:MyBatis 核心知识
在公众号[架构师修炼]菜单中可自行获取专属架构视频资料,包括不限于 java架构、Python系列、人工智能系列、架构系列,以及最新面试、小程序、大前端均无私奉献,你会感谢我的哈
往期精选(全集WX公号【架构师修炼】)
分布式数据之缓存技术,一起来揭开其神秘面纱
分布式数据复制技术,今天就教你真正分身术
数据分布方式之哈希与一致性哈希,我就是个神算子
分布式存储系统三要素,掌握这些就离成功不远了
想要设计一个好的分布式系统,必须搞定这个理论
分布式通信技术之发布订阅,干货满满
分布式通信技术之远程调用:RPC
消息队列Broker主从架构详细设计方案,这一篇就搞定主从架构
消息中间件路由中心你会设计吗,不会就来学学
消息队列消息延迟解决方案,跟着做就行了
秒杀系统每秒上万次下单请求,我们该怎么去设计
【分布式技术】分布式系统调度架构之单体调度,非掌握不可
CDN加速技术,作为开发的我们真的不需要懂吗?
烦人的缓存穿透问题,今天教就你如何去解决
分布式缓存高可用方案,我们都是这么干的
每天百万交易的支付系统,生产环境该怎么设置JVM堆内存大小
你的成神之路我已替你铺好,没铺你来捶我