SpringBoot基础教程(一)| HelloWorld篇

一、SpringBoot简介

Spring Boot 在 Spring 框架上进行了二次封装。它的设计是用于简化 Spring 应用从搭建到开发的过程。应用开箱即用,只要通过一个指令,包括命令行 java -jar 、SpringApplication 应用启动类 、 Spring Boot Maven 插件等,就可以启动应用了。简单来说就是SpringBoot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了很多的jar包,而spring boot整合了很多的框架。

二、SpringBoot的特点

2.1 自动配置

Spring Boot 在不需要任何配置情况下,就直接可以运行一个应用。实际上,Spring Boot 框架的 spring-boot-autoconfigure 依赖做了很多默认的配置项,即应用默认值。这种模式叫做 “自动配置”。Spring Boot 自动配置会根据添加的依赖,自动加载依赖相关的配置属性并启动依赖。例如,默认用的内嵌式容器是 Tomcat ,端口默认设置为 8080。

2.2 外化配置

Spring Boot 简化了配置,在 application.properties 文件配置常用的应用属性。Spring Boot 可以将配置外部化,这种模式叫做 “外化配置”。将配置从代码中分离外置,最明显的作用是只要简单地修改下外化配置文件,就可以在不同环境中,可以运行相同的应用代码。

2.3 内嵌容器

Spring Boot 启动应用,默认情况下是自动启动了内嵌容器 Tomcat,并且自动设置了默认端口为 8080。另外还提供了对 Jetty、Undertow 等容器的支持。开发者自行在添加对应的容器 Starter 组件依赖,即可配置并使用对应内嵌容器实例。

2.4 Starter 组件

Spring Boot 提供了很多 “开箱即用” 的 Starter 组件。Starter 组件是可被加载在应用中的 Maven 依赖项。只需要在 Maven 配置中添加对应的依赖配置,即可使用对应的 Starter 组件。例如,添加 spring-boot-starter-web 依赖,就可用于构建 REST API 服务,其包含了 Spring MVC 和 Tomcat 内嵌容器等。

三、创建SpringBoot工程

首先,打开IDEA,点击新建工程,进入到下图界面

然后选择Spring Initializr,点击Next,进入到maven工程命名界面

输入好自定义的groupId,artifactId以及version后,点击Next,进入到选择starter的界面。

这里我们选择web,然后点击Next,选择完成工程路径后,选择Finish,完成工程创建。

创建完成后,工程的目录结构如下图。

四、启动SpringBoot项目

4.1 创建HelloWorld控制器

在工程目录下,创建一个叫HelloController的Java类,然后在类上加@RestController注解,使其成为一个控制类;再写一个方法,映射到/hello上。

@RestController
public class HelloController {
    @RequestMapping(value = "/hello",method = RequestMethod.GET)
    public String sayHello(){
        return "Hello SpringBoot 2.x !";
    }
}

4.2 启动

在最外层找到SpringBoot的启动类,然后点击运行。

4.3 访问

打开浏览器,输入 http://localhost:8080/hello,便可以观察到输出结果。

五、SpringBoot注解简介

在本项目中我们遇到了几个注解,下面简单解释下它们的意思。

  • @RestController:是@Controller和@ResponseBody的组合,@Controller是标识一个类为控制类,表示这个类可以处理Http请求;@ResponseBody是标识方法的返回值都是Json形式的。
  • @RequestMapping :对方法进行标注,对控制层类的方法进行标注,职责是标明方法对应的 HTTP 请求路由的关系映射。如果括号内只写一个参数,可以省略value字段的,另外value字段可以映射到多个url,写成数组即可;method,表示这个方法是通过什么方式访问的,常见的有Get,Post,Delete,Put。
  • @SpringBootApplication:这个注解是SpringBoot的核心注解之一,包含了@ConfigurationPropertiesScan,@ComponentScan,@EnableAutoConfiguration,@SpringBootConfiguration,@Inherited,@Documented,@Retention以及@Target。
    • @ConfigurationPropertiesScan:可以将配置文件中的属性与配置的Bean进行绑定操作。
      • @ComponentScan:告诉Spring 哪个packages 是用注解标识的类 会被spring自动扫描并且装入bean容器。若我们标识了@Controller,但是没有被扫描进来,是无法处理Http请求的。
      • @EnableAutoConfiguration:借助@Import的帮助,将所有符合自动配置条件的bean定义加载到IoC容器。从classpath中搜寻所有的META-INF/spring.factories配置文件,并将其中org.springframework.boot.autoconfigure.EnableutoConfiguration对应的配置项通过反射(Java Refletion)实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类,然后汇总为一个并加载到IoC容器。
      • @SpringBootConfiguration:继承自@Configuration,二者功能也一致,标注当前类是配置类,并会将当前类内声明的一个或多个以@Bean注解标记的方法的实例纳入到spring容器中,并且实例名就是方法名。
      • @Inherited:使用此注解声明出来的自定义注解,在使用此自定义注解时,如果注解在类上面时,子类会自动继承此注解,否则的话,子类不会继承此注解,这是java自身的注解。
      • @Documented: 表明这个注释是由 javadoc记录的,在默认情况下也有类似的记录工具。 如果一个类型声明被注释了文档化,它的注释成为公共API的一部分,这是java自身的注解。
      • @Retention: RetentionPolicy这个枚举类型的常量描述保留注释的各种策略,它们与元注释(@Retention)一起指定注释要保留多长时间,这是java自身的注解。
      • @Target:ElementType 这个枚举类型的常量提供了一个简单的分类:注释可能出现在Java程序中的语法位置。

六、SpringBootApplication执行流程

我们没有写几行代码,就实现了此功能,由此可以看出SpringBoot的快速启动的特性,下面我们简单分析下SpringBootApplication的执行流程。

  • 创建SpringApplication对象,并在对象创建出来之前,执行以下三步
    1.根据org.springframework.web.context.ConfigurableWebApplicationContext来决定是否创建一个为Web应用使用的ApplicationContext类型。
    2.使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer。
    3.使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationListener。

  • SpringApplication实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,首先遍历执行所有通过SpringFactoriesLoader可以查找到并加载的SpringApplicationRunListener并调用它们的started()方法。

  • 创建并配置当前Spring Boot应用将要使用的Environment。

  • 遍历调用所有SpringApplicationRunListener的environmentPrepared()的方法。

  • 检查SpringApplication的showBanner属性,若为true则打印banner。

  • 根据用户是否明确设置了applicationContextClass类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的ApplicationContext并创建完成,然后根据条件决定是否添加ShutdownHook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,当然,最重要的,将之前准备好的Environment设置给创建好的ApplicationContext使用。

  • ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中所有可用的ApplicationContext-Initializer,然后遍历调用这些ApplicationContextInitializer的initialize(applicationContext)方法来对已经创建好的ApplicationContext进行进一步的处理。

  • 遍历调用所有SpringApplicationRunListener的contextPrepared()方法。

  • 将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext。

  • 遍历调用所有SpringApplicationRunListener的contextLoaded()方法。

  • 调用ApplicationContext的refresh()方法,完成IoC容器可用的最后一道工序。

  • 查找当前ApplicationContext中是否注册有CommandLineRunner,如果有,则遍历执行它们。

  • 遍历执行SpringApplicationRunListener的finished()方法,如果整个过程出现异常,会将异常信息一并传入处理。

完整的工程代码链接:https://github.com/youzhihua/springboot-training

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务