笔记:SpringBoot教程快速入门-基础-SpringBoot简介&快速入门案例(一)

前置知识
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 实现步骤

  1. 创建Maven项目
  2. 导入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>
  1. 定义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!";
      }
  }
  1. 编写引导类
  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);
      }
  }

  1. 启动测试
    运行HelloApplication的main方法即可
2021-09-21 17:25:28.542  INFO 14916 --- [           main] cn.hpy.HelloApplication                  : Starting HelloApplication on lenovoE560 with PID 14916 (F:\06-code\java\springboot\springboot-helloworld\target\classes started by hpy in F:\06-code\java\springboot)
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
视频教程

posted @ 2021-09-21 17:34  AfreadHuang  阅读(122)  评论(0编辑  收藏  举报