SpringBoot基础使用(1)——SpringBoot入门、SpringBoot原理分析

本文介绍了SpringBoot的优缺点,以及如何通过SpringBoot解决Spring的配置难题。讲解了SpringBoot的起步依赖、自动配置等核心功能,并展示了快速入门SpringBoot的步骤。此外,还分析了SpringBoot的起步依赖原理,探讨了微服务的概念。

目录

1.SpringBoot简介

1.1 Spring优缺点分析

1.2 SpringBoot的概述

1.2.1 SpringBoot解决上述Spring的缺点

1.2.2 SpringBoot的特点

1.2.3 SpringBoot的核心功能

2.SpringBoot快速入门

2.1 代码实现

2.1.1 创建Maven工程

2.1.2 添加SpringBoot的起步依赖

2.1.3 编写SpringBoot引导类

2.1.4 编写Controller

2.1.5 测试

2.2 SpringBoot工程热部署

2.3 使用idea快速创建SpringBoot项目

3.SpringBoot原理分析

3.1 起步依赖原理分析

3.1.1 分析spring-boot-starter-parent

3.1.2 分析spring-boot-starter-web

3.2 自动配置原理解析


1.SpringBoot与微服务简介

1.1 Spring优缺点分析

优点:

  • Spring是Java企业版(Java Enterprise Edition,JEE,也称J2EE)的轻量级代替品。无需开发重量级的Enterprise JavaBean(EJB),Spring为企业级Java开发提供了一种相对简单的方法,通过依赖注入和面向切面编程,用简单的Java对象(Plain Old Java Object,POJO)实现了EJB的功能。

缺点:

  • 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的。一开始,Spring用XML配置,而且是很多XML配置。Spring 2.5引入了基于注解的组件扫描,这消除了大量针对应用程序自身组件的显式XML配置。Spring 3.0引入了基于Java的配置,这是一种类型安全的可重构配置方式,可以代替XML。
  • 所有这些配置都代表了开发时的损耗。因为在思考Spring特性配置和解决业务问题之间需要进行思维切换,所以编写配置挤占了编写应用程序逻辑的时间。和所有框架一样,Spring实用,但与此同时它要求的我们付出的代价也不少。
  • 除此之外,项目的依赖管理也是一件耗时耗力的事情。在环境搭建时,需要分析要导入哪些库的坐标,而且还需要分析导入与之有依赖关系的其他库的坐标,一旦选错了依赖的版本,随之而来的不兼容问题就会严重阻碍项目的开发进度。

基于上述缺点,就诞生了SpringBoot

1.2 SpringBoot的概述

1.2.1 SpringBoot解决上述Spring的缺点

SpringBoot对上述Spring的缺点进行的改善和优化,基于约定优于配置的思想,可以让开发人员不必在配置与逻辑业务之间进行思维的切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发的效率,一定程度上缩短了项目周期。

1.2.2 SpringBoot的特点

  • 可以快速创建独立运行的Spring项目以及与主流框架集成

  • 使用嵌入式的Servlet容器,应用无需打成war包

  • 大量的自动配置,简化开发,同时也可以修改默认值来满足特定的需求

  • 无需XML配置,无代码生成,开箱即用

  • 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等

  • 准生产环境的运行时应用监控

  • 与云计算的天然集成

  • SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式

1.2.3 SpringBoot的核心功能

  • 起步依赖

    • 起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依赖,这些东西加在一起即支持某项功能。
    • 简单的说,原先我们完成某个功能需要导入一堆坐标,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。
  • 自动配置

    • Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。

1.3 微服务简介

微服务是一种架构风格,它提倡一个应用应该是一组小型服务,而这些每个小型服务都运行在自己的进程内,它们之间通过http的方式进行互通。

而我们先来看一下以前的单体应用:

  • 在一个应用中,我们将所有的页面,包括服务的代码,都写在一起,打包成war包,部署在tomcat当中
  • 这种模式优点:
    • 开发简单,只有一个应用,不牵扯到多个应用之间的互联互调
    • 部署简单,只需要打包成war包,放在tomcat服务器上,不会给运维带来太大困难
    • 水平扩展容易,当一个应用的负载能力不行的时候,我们把该应用复制多份,部署在多个服务器当中,让这多个服务器都来跑应用程序,就可以通过负载均衡机制来提高并发能力
  • 缺点:
    • 牵一发而动全身,当我们改动一部分,可能整个软件都需要重新部署
    • 日益增长的软件需求,现在随便一个应用都有可能变成大型应用,我们不可能把一个大型应用写在一个应用当中,造成巨大的维护和分工的成本

因此出现了微服务

  • 微服务是以功能为单位,把每个功能元素独立出来,拥有它们自己的进程
  • 可以通过功能元素的动态组合或者某一些功能只在有需要的时候才进行复制,这样节省了资源
  • 每一个功能元素(服务)都是可替换的,可独立升级的软件单元

  • 分析:
    • 这么多服务,每个服务都是独立的项目,让我们用传统的方式去构建项目,都会花费巨大的精力,而上述介绍的SpringBoot恰好可以快速的帮我们来以功能为单位来构建应用
    • 整个系统这么大的分布式网怎么互联互调,SpringCloud帮我们解决此问题
    • 包括在分布式中间做批处理和流式计算,SpringCloud Data Flow来解决

2.SpringBoot快速入门

2.1 代码实现

2.1.1 创建Maven工程

使用idea工具创建一个maven工程,该工程为普通的java工程即可

2.1.2 添加SpringBoot的起步依赖

SpringBoot要求,所有的SpringBoot项目都要继承SpringBoot的起步依赖spring-boot-starter-parent

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
</parent>

SpringBoot要集成SpringMVC进行Controller的开发,所以项目要导入web的启动依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

2.1.3 编写SpringBoot引导类

要通过SpringBoot提供的引导类起步SpringBoot才可以进行访问

package cn.cqu;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication   //用于标注当前类是SpringBoot的引导类
public class MySpringBootApplication {
    //main方法是Java程序的入口
    public static void main(String[] args) {
        SpringApplication.run(MySpringBootApplication.class);
    }

}
  • @SpringBootApplication:标注SpringBoot的启动类,该注解具备多种功能(后面详细剖析)

  • SpringApplication.run(MySpringBootApplication.class) 代表运行SpringBoot的启动类,参数为SpringBoot启动类的字节码对象

  • main方法与启动类不一定要定义在一块,在哪个类上面加@SpringBootApplication,该类就是启动类,然后不管在哪个类中写main方法,然后在main方法中执行SpringApplication(启动类字节码对象);即可

2.1.4 编写Controller

在引导类MySpringBootApplication所在包或者所在包的子级包中创建QuickStartController

package cn.cqu.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


//这个类的所有方法返回的数据直接给浏览器(如果是对象转为json数据)
/*
@ResponseBody
@Controller
*/
//上述两个注解等价于
@RestController
public class QuickController {

    @RequestMapping("quick")
    public String quick(){
        return "Hello,SpringBoot";
    }
}

2.1.5 测试

执行SpringBoot起步类的主方法,控制台打印日志如下: 

通过日志发现,Tomcat started on port(s): 8080 (http) with context path '',说明它内嵌了tomcat

tomcat已经起步,端口监听8080,web应用的虚拟工程名称为空

打开浏览器访问url地址为:http://localhost:8080/quick

2.1.6 简化部署

SpringBoot的应用完全可以不打war包,直接创建一个可执行的jar包即可

在pom.xml中添加(上述已添加)

这个插件可以将一个SpringBoot项目打包成jar包

我们可以将它复制到桌面

我们可以在cmd中通过命令直接运行它

打开浏览器访问url地址为:http://localhost:8080/quick

或者直接双击桌面的该jar包程序,也可以让SpringBoot的项目跑起来,使用上述cmd是为了进行演示

2.2 SpringBoot工程热部署

我们在开发中反复修改类、页面等资源,每次修改后都是需要重新启动才生效,这样每次启动都很麻烦,浪费了大量的时间,我们可以在修改代码后不重启就能生效,在 pom.xml 中添加如下配置就可以实现这样的功能,我们称之为热部署。

<!--热部署配置-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
</dependency>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!--fork:设置True,否则可能devtools不会起作用-->
                    <fork>true</fork>
                </configuration>
            </plugin>
        </plugins>
    </build>

注意:IDEA进行SpringBoot热部署失败原因

出现这种情况,并不是热部署配置问题,其根本原因是因为Intellij IEDA默认情况下不会自动编译,需要对IDEA进行自动编译的设置,如下:

然后 Shift+Ctrl+Alt+/,选择Registry

2.3 使用idea快速创建SpringBoot项目

以下是选择我们需要的功能,Idea会自动帮我们配置好我们选择的环境

通过idea快速创建的SpringBoot项目的pom.xml中已经导入了我们选择的web的起步依赖的坐标,并且包括springBoot单元测试所依赖的jar包

默认生成的Spring Boot项目:

  • 主程序和测试程序已经生成好了,我们只需要我们自己的逻辑
  • resources文件夹中目录结构
    • static:保存所有的静态资源; js css  images;
    • templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页 面);可以使用模板引擎(freemarker、thymeleaf);
    • application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;

3.SpringBoot原理分析

3.1 起步依赖原理分析

3.1.1 分析spring-boot-starter-parent

按住Ctrl点击pom.xml中的spring-boot-starter-parent,跳转到了spring-boot-starter-parent的pom.xml,xml配置如下(只摘抄了部分重点配置):

以下是资源引入,SpringBoot让我们自己配置的文件,文件的目录即为我们工程的resources目录下,而我们可以使用的配置文件l类型有yml,yaml,properties,而且我们的配置文件必须以application开头

再按住Ctrl点击pom.xml中的spring-boot-starter-dependencies,跳转到了spring-boot-starter-dependencies的pom.xml,xml配置如下(只摘抄了部分重点配置):

以下为Maven的jar包版本管理,SpringBoot已经帮我们做好,不需要我们去配置,更不会产生jar包冲突

锁定jar包版本

  • 所以spring-boot-starter-dependencies来真正管理SpringBoot应用里边所有依赖的版本
  • 所以以后我们导入依赖默认是不需要写版本(没有在dependencies里面管理的依赖自然需要声明版本号)

3.1.2 分析spring-boot-starter-web

按住Ctrl点击pom.xml中的spring-boot-starter-web,跳转到了spring-boot-starter-web的pom.xml,xml配置如下(只摘抄了部分重点配置):

  • 从上面的spring-boot-starter-web的pom.xml中我们可以发现,spring-boot-starter-web就是将web开发要使用的spring-web、spring-webmvc等坐标进行了“打包”,这样我们的工程只要引入spring-boot-starter-web起步依赖的坐标就可以进行web开发了,同样体现了依赖传递的作用。
  •  spring-boot-starter:spring-boot场景启动器;帮我们导入了web模块正常运行所依赖的组件

Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter 相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。我们查看官方文档,可以发现,官方针对功能提供了大量的starters

3.2 自动配置原理解析

按住Ctrl点击查看启动类MySpringBootApplication上的注解@SpringBootApplication

@SpringBootApplication具有以下三个注解的共同作用

  • @SpringBootConfiguration:等同于@Configuration,即标注该类是Spring的一个配置类,配置类也是容器的一个组件;@Component
  • @ComponentScan:扫描当前引导类所在的包及其子包下面的所有的bean
  • @EnableAutoConfiguration:SpringBoot自动配置功能开启
    • 以前我们需要配置的东西,Spring Boot帮我们自动配置;@EnableAutoConfiguration告诉SpringBoot开启自 动配置功能;这样自动配置才能生效;
  • @AutoConfigurationPackage:自动配置包
    • Spring的底层注解@Import,给容器中导入一个组件;导入的组件由 AutoConfigurationPackages.Registrar.class来指定
    • 所以,@AutoConfigurationPackage本身的含义:将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器
  • 其中,@Import(AutoConfigurationImportSelector.class) 导入了AutoConfigurationImportSelector类(@Import是在当前这个配置下引入其他的配置类)
    • AutoConfigurationImportSelector.class:
      •  是导入哪些组件的选择器;
      • 将所有需要导入的组件以全类名的方式返回;这些组件就会被添加到容器中;
    • 按住Ctrl点击查看AutoConfigurationImportSelector源码
    • 上述方法说明加载某些配置
    • 其中,SpringFactoriesLoader.loadFactoryNames 方法的作用就是从META-INF/spring.factories文件中读取指定类对应的类名称列表
    • spring.factories 文件中有关自动配置的配置信息如下:
    • 上面配置文件存在大量的以AutoConfiguration为结尾的类名称,这些类就是存有自动配置信息的类,而SpringApplication在获取这些类名后再加载
    • 所以最终会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件, 并配置好这些组件;
      • 有了自动配置类,免去了我们手动编写配置注入功能组件等的工作;
    • 我们以ServletWebServerFactoryAutoConfiguration为例来分析源码:
    • 其中,@EnableConfigurationProperties(ServerProperties.class) 代表加载ServerProperties服务器配置属性类

  • 进入ServerProperties.class源码如下:

  • 其中,prefix = "server" 表示SpringBoot配置文件中的前缀,SpringBoot会将配置文件中以server开始的属性映射到该类的字段中。映射关系如下:

  • 默认配置在下述文件中:

    • J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-2.0.1.RELEASE.jar包当中

  • 例如默认端口号的配置:

  • 我们自己的配置覆盖它的自动配置

  • 同理,其他的以AutoConfiguration为结尾的类也都有它们的自动配置

所以通过以上分析,可以发现,我们自己在resources目录下写的properties文件或者yml或yaml文件的配置会自动覆盖默认的配置,所以我们可以通过properties文件,yml,或yaml文件来进行自己的配置

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值