SpringBoot入门到精通-SpringBoot入门

Posted 墨家巨子@俏如来

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot入门到精通-SpringBoot入门相关的知识,希望对你有一定的参考价值。

SpringBoot入门到精通系列


前言

经过上面的学习,我们已经掌握的Spring的注解式编程,有此基础后我们再学习SpringBoot就易如反掌,因为SpringBoot就是基于Spring的注解式编程进行开发。接下来我们就正式开始SpringBoot部分内容的学习,先来做个入门程序。

三.SpringBoot入门程序

我们来玩一个入门案例,使用SpringBoot编写一个简单的WEB程序,使用浏览器访问后台能够返回一个“Hello Spring Boot”即可。那么我么思考一下,如果我么使用SpringMVC来做这个案例需要做哪些事情?

  1. 创建一个web工程(打包方式为 war)
  2. 导入Spirng相关,SpringMVC相关,Jackson相关,日志相关等等一大堆jar包。
  3. web.xml中配置:前端控制器DispatcherServlet;编码过滤器;配置上下文参数(指定Spring的xml配置文件地址)等
  4. 编写SpringMVC的xml配置文件,然后里面配置一堆东西
  5. 编写Controller,编写方法

总之,使用SpringMVC编写这个web程序是非常麻烦的,那么我们看一下使用SpirngBoot来实现又什么区别

1.搭建HelloWorld

你可以参照官方该文档去搭建 ,也可以按照我下面的步骤来搭建

1.1.创建工程

注意,创建工程的时候选择骨架选择 quickstart(普通的jar项目即可),当然也可以不选择骨架,默认就是普通java项目。总之不要创建一个webapp项目(这是为什么呢??)

1.2.导入相关依赖

<!--    打包方式jar-->
<packaging>jar</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.5.RELEASE</version>
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

spring-boot-starter-parent是SpringBoot提供的工程 ,spring-boot-starter-web是SpringBoot整合SpringMVC的依赖。此刻你可能会有些疑问,后面我再解释,稍安勿躁。

1.3.创建配置类

配置类也是启动类,贴上@SpringBootApplication最,提供一个main方法来启动应用

@SpringBootApplication
public class ApplicationConfig 

    public static void main(String[] args) 
        //启动程序
        SpringApplication.run(ApplicationConfig.class);
    


1.4.编写Controller

@RestController
public class HelloController 
	
	@RequestMapping("/hello")
	public String hello() 
		return "Hello Spring Boot";
	

代码到这里编写完成,项目结构如下

1.5.启动Main方法测试

控制台启动效果

端口默认是8080 , 使用浏览器访问 http://localhost:8080/hello,效果如下

在一开始我们就有知道,SpringBoot是用来简化Spring应用的搭建和开发,使用了SpringBoot之后确实简单了很多,集成速度也快了很多。但是在简单的背后意味着复杂的封装。

2.HelloWorld分析

完成了上面案例相信你也看到了测试效果,此刻你或许有很多地方不理解,比如:pom.xml为什么只需要导入一个jar包,为什么web项目使用的是平通java项目的结构;为什么不在需要web.xml; 使用main方法就能启动程序等等。下面我们一一解答

2.1.pom.xml分析

pom中有3个点是需要给大家讲一下的

  1. 打包方式:jar
  2. 使用引入了一个 spring-boot-starter-parent 工程
  3. 导入了一个 spring-boot-starter-web 依赖包

【重要】对于SpringBoot而言即使是开发WEB项目也是采用普通java项目的结构,打包方式默认使用个jar ,也不再需要WEB-INF/web.xml等结构。当然SpringBoot也可以使用 war的方式来打包项目,这个我们后面再说。

<parent> 可以看做是Java中的 extends,用来继承一个项目后就可以使用该项目中的依赖,对于 spring-boot-starter-parent而言该项目是SpringBoot的父项目,它提供了基础依赖和插件管理。进入到spring-boot-starter-parent的pom.xml中我们可以看到它又使用<parent>继承了一个 spring-boot-dependencies 工程,如下(ctrl + 左键):

<parent>
    <groupId>org.springframework.boot</groupId>
       <!--又继承了 spring-boot-dependencies-->
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
  </parent>
  <artifactId>spring-boot-starter-parent</artifactId>
  <packaging>pom</packaging>
  <name>Spring Boot Starter Parent</name>
  <description>Parent pom providing dependency and plugin management for applications
		built with Maven</description>
  <url>https://projects.spring.io/spring-boot/#/spring-boot-starter-parent</url>
  <properties>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <!--JDK版本-->
    <java.version>1.8</java.version>
    <resource.delimiter>@</resource.delimiter>
    <maven.compiler.source>$java.version</maven.compiler.source>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>$java.version</maven.compiler.target>
  </properties>

可以看到,spring-boot-starter-parent 继承了 spring-boot-dependencies ,它的打包方式是 <packaging>pom</packaging>, 默认使用的是JDK版本是1.8,我们可以在自己项目的pom.xml中通过 <java.version>1.7</java.version> 来修改JDK版本。

真正管理依赖的是其实是 spring-boot-dependencies ,安装ctrl点击进去可以看到 ,该项目的<properties>中管理了很多很多的version, 在其 dependencyManagement中管理了很多很多的基础依赖,在其 pluginManagement 中管理了很多是插件。

总之:【重要】我们要使用SpringBoot就需要通过<parent>继承spring-boot-starter-parent ,该父工程为我们管理了很多很多的依赖和插件,如果我们要使用某个依赖,只需要在我们自己的项目的pom引入,无需指定版本号,因为SpringBoot已经帮我们把版本号管理起来了。比如我们要导入一个测试包,就在自己的项目的pom.xml这样导入

 <dependency>
     <groupId>junit</groupId>
     <artifactId>junit</artifactId>
</dependency>

无需导入版本号,因为父工程已经管理起来了,除非你要修改默认的版本。

在导入 spring-boot-starter-web 的时候我们也是么有指定版本号,可想而知该依赖是被spring-boot-starter-parent管理起来了的,那么该依赖的作用是什么呢?看名字能够猜到,它是SpringBoot和WEB环境整合的一个依赖。我们可以打开该依赖的结构查看一下

【重要】可以看到,一个spring-boot-starter-web导入了很多的其他依赖,如:Spring的基础依赖,SpringMVC的基础依赖,Jackson基础依赖,日志基础依赖,Tomcat的依赖,自动配置的依赖,所以这个spring-boot-starter-web把集成Web环境所需要的所有依赖都导入进来了。你似乎明白点什么了?

【重要】顺便解答一个问题:为什么不需要部署Tomcat? 因为 spring-boot-starter-web 已经导入了一个tomcat(SpringBoot内嵌Tomcat),当我们启动main方法时,底层就会启动内嵌的Tomcat,不在需要我们自己部署。

2.2.启动类分析

下面我们来分析启动类,也就是配置类。在之前我们学习Spring的Java Config有说过,就是使用一个Java类来取代Spring的xml配置作为配置文件,SpringBoot就是使用Spring的Java Config配置。所以我们刚才的 ApplicationConfig 就是一个配置类,同时它提供了一个main方法来启动项目,所以也是启动类。有两个东西需要分析

  1. 注解:@SpringBootApplication
  2. 启动:SpringApplication.run(ApplicationConfig.class)

@SpringBootApplication 是SpringBoot提供的一个复合注解,它由三个注解组成,源码如下

//配置注解,该注解上又贴了一个 @Configuration
@SpringBootConfiguration
//开启自动配置
@EnableAutoConfiguration
//Spring IOC自动扫描
@ComponentScan(
    excludeFilters = @Filter(
    type = FilterType.CUSTOM,
    classes = TypeExcludeFilter.class
), @Filter(
    type = FilterType.CUSTOM,
    classes = AutoConfigurationExcludeFilter.class
)
)
public @interface SpringBootApplication 
    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    Class<?>[] exclude() default ;

    @AliasFor(
        annotation = EnableAutoConfiguration.class
    )
    String[] excludeName() default ;

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackages"
    )
    String[] scanBasePackages() default ;

    @AliasFor(
        annotation = ComponentScan.class,
        attribute = "basePackageClasses"
    )
    Class<?>[] scanBasePackageClasses() default ;

    @AliasFor(
        annotation = Configuration.class
    )
    boolean proxyBeanMethods() default true;


【重要】@SpringBootApplication 包含了三个注解

  • @SpringBootConfiguration :该注解的本质其实就是一个 @Configuration 配置注解,标记某个类成为配置类
  • @EnableAutoConfiguration :开启SpringBoot自动配置的注解,比如我们集成SpringMVC并没有配置DispatcherServlet前端控制器,但是这个东西一定是存在的,就是SpringBoot帮我们自动配置好了。
  • @ComponentScan :这个在讲Spring的Java Config就有介绍,它是Spring IOC的自动扫描的注解,默认扫描当前包及其子包中的打了 @Component;@Repository;@Service;@Controller 注解的类。也就是说我们的HelloController其实已经被启动类默认扫描到了。
  • 该注解中还提供了 exclude 可以让我们去排除某些类不需要被Spring注册。
  • 也可以通过 scanBasePackages 来修改扫描的包路径

【重要】也就是说标记了 @SpringBootApplication 注解的类,即是一个Spring的配置类,也拥有IOC自动扫描的能力,同时开启了SpringBoot的自动配置的能力。

对于main方法中的 SpringApplication.run 我们知道它的作用是用来启动程序的,该方法会初始化好SpringBoot的环境,并创建AnnotationConfigApplicationContext作为Spring的IOC容器类,然后会执行容器类的 refresh 方法进行刷新。加载Bean,注册Bean,实例化Bean,自动配置,内嵌的Tomcat启动都在该方法中。具体细节后面会专门说到,这里就做讨论了。

2.3.小扩展

dependencyManagement 和 dependencies

我们在SpringBoot的父项目中有看到 dependencyManagement 元素,那么在该元素中的依赖和 放在 dependencies中的依赖有什么区别呢?放在dependencies中的依赖是可以直接使用的,放在 dependencyManagement 中的依赖只是起到了声明或管理的作用,其中的依赖还不能直接使用,需要在dependencies引入才能使用。

那dependencyManagement有什么意义?它的意义就是管理版本,通常在父项目中使用 dependencyManagement 管理依赖,在子项目中dependencies导入依赖,然后无需版本号引入,因为版本号交给父项目管理了。SpringBoot就是这样干的。

packaging为jar和war的区别

我们需要在pom中指定 <packaging>jar</packaging> 来标记项目的打包类型,有四种类型可以指定

  • jar : 打jar包,执行maven的 package命令 就可以把项目打成一个 xx.jar ,这种打包用在普通java项目,SpringBoot默认打jar包。
  • war :打 war 包,执行maven的 package命令 就可以把项目打成一个 xx.war ,如果是传统的SpringMVC开发的项目就是一个war的项目。
  • pom :这种打包方式代表该项目是用来管理依赖的项目,不需要写任何java代码,通常是一个父项目,被子工厂来继承,比如SpringBoot的父项目 spring-boot-starter-parent 就是打 pom 包。
  • maven-plugin :这个比较少用,它是用来开发maven插件的。

3.项目结构认识

SpringBoot项目标准结构如下

代码存放于java 目录 , resources目录中包括

  • static : 静态资源目录,比如css,js,html都放在该目录,类似于以前的webapp目录。默认情况下,Spring Boot从classpath下 的 /static ( /public , /resources 或 /META-INF/resources )文件夹, 或从 ServletContext 根目录提供静态内容
  • templates :模板文件目录 ,比如xxx.jsp文件就放到该目录,类似于 WEB-INF 目录
  • application.properties : 该文件是SpringBoot默认的配置文件名,如果要对项目做一些自定义的配置就修改该文件的内容即可,比如要修改端口,我们加入如下内容 server.port=8181 。还有一个默认配置是application.yml ,这个我们后面再说。

4.SpringBoot的特点总结

根据上面Hello分析我们可以总结出SpringBoot的一些特点

  • SpringBoot基于Spring高度封装,使用简单高效,很容易就能继承三方框架,比如继承SpringMVC就需要导入一个spring-boot-starter-web即可。
  • SpringBoot基于Spring的注解式配置,无需xml,简化了大量的配置
  • SpringBoot的父项目帮我们管理了很多的基础依赖和不能,大大简化了maven
  • SpringBoot内嵌了Tomcat,使用main方法即可启动,部署简单
  • SpringBoot自动配置功能让配置更加简单

一个字,爽 , 但是缺点就是封装的太深,你需要花费很大的精力去了解它的封装过程。

文章就到这里把,喜欢的话请一定给个好评哦,喜欢的话请一定给个好评哦,喜欢的话请一定给个好评哦。

以上是关于SpringBoot入门到精通-SpringBoot入门的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot入门到精通-SpringBoot入门

SpringBoot入门到精通-SpringBoot自定义starter

SpringBoot入门到精通-SpringBoot集成SSM开发项目

SpringBoot入门到精通-Spring的注解编程

SpringBoot入门到精通-Spring的基本使用

Java之Spring Boot入门到精通IDEA版SpringBoot原理分析,SpringBoot监控(一篇文章精通系列)下