前置知识
1、你需要java基础的知识
2、你需要Spring、SpringMVC、Mybatis框架的知识
1. Spring Boot概述
1.1 Spring Boot 概念
我们知道Spring家族有Spring Boot、Spring Framework、Spring Data、Spring Cloud、Spring Security等成员,而Spring Boot作为Spring家族最优秀的项目之一占有举足轻重的地位。2014年4月Spring Boot 1.0.0发布,她提供了一种快速使用Spring的方式,基于约定大约配置(约定俗成)的思想大大简化了Spring原有的繁琐的配置,从而提高开发效率。由此可见其实Spring Boot提供了一种快速使用Spring的方式,而非对Spring原有功能的一个增强。
当然Spring Boot出现不仅仅是简化了配置,我们知道Spring本身有两个弊病,一则Spring配置繁琐,其次各个模块(包)之前的依赖同样繁琐,所有的包由开发人员手动进行管理,因此每当我们导入一个新的坐标,就需要考量这个包的依赖关系以及版本的管理,一旦出现版本不匹配而导致的兼容问题会严重影响项目的开发进度,以及可能给项目埋下未知的安全隐患。
1.1 Spring Boot 特点
Spring Boot为了解决Spring上述的问题做了以下几个点的努力:
- 自动配置-Spring Boot在Spring Boot启动时根据各方面的因素决定加载哪些模块,不加载哪些模块;(后续高级课程会专门探讨自动配置的实现机制);
- 起步依赖-为了解决依赖的问题,Spring Boot将具备某种功能的坐标打包到一起,并且提供一些默认的功能,这样就解决了不同的包之前依赖和版本的问题;
- 辅助功能-除以上两点外Spring Boot为了方面开发人员,提供了一些大型项目中常用但是非功能性的特性,比如嵌入式服务器、安全、指标、健康监测、外部配置等。
2. SpringBoot快速入门
2.1 需求
搭建Spring Boot工程,定义HelloController控制器,并在该控制器下定义hello()方法,返回“Hello Spring Boot!”。
2.2 实现步骤
- 创建Maven项目
- 导入Spring Boot起步依赖
在pom.xml文件中加入以下配置
<!--springboot工程需要继承的父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
</parent>
<dependencies>
<!--web开发的起步依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
- 定义Controller
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("/hello")
public String hello() {
return "Hello Spring Boot!";
}
}
- 编写引导类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/**
* 引导类。 SpringBoot项目的入口
*/
@SpringBootApplication
public class HelloApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(HelloApplication.class, args);
}
}
- 启动测试
运行HelloApplication的main方法即可
2021-09-21 17:25:28.542 INFO 14916 --- [ main] cn.hpy.HelloApplication : Starting HelloApplication on lenovoE560 with PID 14916 (F: 6-codejavaspringbootspringboot-helloworld argetclasses started by hpy in F: 6-codejavaspringboot)
2021-09-21 17:25:28.553 INFO 14916 --- [ main] cn.hpy.HelloApplication : No active profile set, falling back to default profiles: default
2021-09-21 17:25:30.900 INFO 14916 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-09-21 17:25:30.952 INFO 14916 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-09-21 17:25:30.953 INFO 14916 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.24]
2021-09-21 17:25:31.361 INFO 14916 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-09-21 17:25:31.362 INFO 14916 --- [ main] o.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 2741 ms
2021-09-21 17:25:31.918 INFO 14916 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor'
2021-09-21 17:25:32.167 INFO 14916 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2021-09-21 17:25:32.173 INFO 14916 --- [ main] cn.hpy.HelloApplication : Started HelloApplication in 4.389 seconds (JVM running for 8.277)
以上为运行结果,可以通过Tomcat started on port(s): 8080 (http) with context path ''看出,Spring Boot使用内置的Tomcat启动的8080默认端口,接下来我们直接访问 http://localhost:8080/hello
就可以看到浏览器输出Hello Spring Boot!
字符串了。
2.3 Spring Boot 快速入门小结
- Spring Boot使用JAR的打包方式运行项目
- Spring Boot的引导类是项目的入口,运行main方法就可以启动项目;
- 不论使用Spring Boot或Spring构建项目业务代码编写的方式其实是一样的。
3. Spring Boot起步依赖原理分析
3.1 POM文件分析
spring-boot-starter-parent继承自spring-boot-dependencies,下面我们来看一下spring-boot-dependencies的部分定义:
...
<properties>
...
<elasticsearch.version>6.4.3</elasticsearch.version>
...
</properties>
<dependencyManagement>
...
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch.version}</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>${elasticsearch.version}</version>
<exclusions>
<exclusion>
<artifactId>commons-logging</artifactId>
<groupId>commons-logging</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
...
</dependencyManagement>
不难看出Spring Boot 通过properties定义好了elaticsearch的版本号,在dependencyManagement标签中引用properties已经定义好的版本号达到版本锁定的目的。同时用exclusions标签排除掉Spring Boot已经依赖的包commons-logging(Spring Boot默认日志框架),保持包的唯一性。而spring-boot-starter-data-elasticsearch是Spring Boot为elasticsearch定义的starter目的是在IOC容器中按需加载elaticsearch。(后续章节会详细讲解)
3.2 小结
- 在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本;
- 在各种starter中,定义了完成该功能需要的坐标合集,其中大部分版本信息来自于父工程;
- 我们的工程继承parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突等问题。
引申思考:Spring Boot既然如此好用那么我们还有必要用Spring来构建项目吗?如果有必要是在哪种场景下面呢?有Spring支持但是Spring Boot却不支持的功能吗?
参考文献
spring boot
视频教程