Java学习笔记分享之Spring Boot篇(基础)

    科技2022-07-11  100

    1.1 Spring Boot思想

    Spring Boot是所有基于Spring开发项目的起点。Spring Boot的设计目的是为了让我们快速的启动一个Spring应用程序并且减少配置工作。

    ​ Spring Boot的核心思想是:约定由于配置(Convention over Configuration),和MVC三层架构一样是一种软件设计范式。

    ​ 约定由于配置从本质来说,就是系统、框架等需要配置的项都要有合适的默认值,而不应该让使用者提供这些不必配置。例如:

    MySQL数据库应该提供默认端口,而不应该让使用者指定,MySQL默认端口是3306。

    Tomcat应用服务器提供默认的访问端口,Tomcat默认端口是8080。

    开发中团队约定所有的数据库表都用t_为前缀。

    以上这些都是约定,约定提供了配置项的默认值,如果不修改就使用默认值。当需要修改的时候,就是使用者配置的项。

    1.2 Spring Boot为何诞生

    ​ 任何的框架都不会无缘无故诞生,框架的诞生都是需求的具体表现。所以Spring Boot也不是随便就诞生了,它的出现可以说是技术发展到一定阶段必然的产物。

    1.2.1 Spring分析

    优点:

    替代了JavaEE框架,提供了轻量级的开发方式。解决了EJB企业级开发框架的重配置和重资源问题。提供了IOC和AOP编程思想。

    缺点:

    Spring 的组件划分的非常细使用轻,需要的资源少。但是Spring的配置比较繁琐,很多功能都需要一大堆的XML配置才可以完成引入。虽然后续的发展Spring 引入了注解、Java API配置功能,减少了很多的配置,但是Spring整合其他框架的时候配置还是非常的多的。Spring整合其他框架的时候如何解决Maven依赖的问题也非常浪费时间。需要分析某一个技术、框架需要引入那些Jar包。版本引入错误还要解决冲突的问题。

    1.2.2 Spring Boot的核心

    ​ 基于上诉Spring框架的缺点问题,Spring Boot基于约定由于配置的思想诞生了。

    自动依赖

    ​ 自动依赖其实就是一个Maven项目对象模型,定义了其他类库的依赖传递,并且添加了一些功能。将某个框架/技术需要的Jar打包到一起,只需要引入一个就可以引入所有,并且解决了版本冲突问题

    自动装配

    ​ 自动装配也叫做自动配置,自动配置可以从两个方向去理解。

    Bean的自动注册到IOC容器引入的功能不需要额外的配置,都会基于默认值给我们配置好

    1.3 Spring Boot快速体验

    需求: 通过URL访问Controller,返回Hello World

    注意: Spring Boot的构建是需要连接服务器的,默认情况都是使用https://start.spring.io服务器。如果网络连接有问题可以访问阿里巴巴提供的构建网站 https://start.aliyun.com/bootstrap.html

    使用IDEA提供的Spring Initializr构建Spring Boot项目

    Spring Initializr提供了一个构建应用的平台,只需要在上面选择项目的技术即可,Spring Initializr会自动根据Spring Boot的版本选择合适的框架版本依赖。可以快速帮助我们构建一个应用。

    项目基础的信息完成选择后,需要等待构建以及项目下载,所以需要一定的时间。

    Spring Boot项目创建好以后,项目目录结构如下:

    创建支持Web方式访问的DemoController

    @RestController public class DemoController { @GetMapping("/demo/sayHello") public String sayHello() { return "Hello World"; } }

    启动项目

    Spring Boot默认端口是8080(因为内嵌了tomcat服务器),项目启动完成后,访问Controller方法http://localhost:8080/demo/sayHello

    页面正常输出了Hello World,这样简单的几步就可以基于Spring Boot构建一个Web应用并启动。

    对单元测试的支持

    Spring Boot项目构建以后,再test文件夹下会生成一个测试类。可以模拟到Spring Boot项目启动的过程,对于需要的资源会自动加载。例如:配置文件信息加载、bean实例的创建并交给spring ioc容器等。

    @SpringBootTest // 标注是一个测试Spring Boot,启动时候会初始化资源 class DemoApplicationTests { @Autowired // 注入Controller private DemoController demoController; @Test public void tset() { // 调用sayHello方法 String sayHello = demoController.sayHello(); // 结果输出到控制台 System.out.println(sayHello); } }

    1.4 Spring Boot热部署

    ​ 默认情况下,Spring Boot每次修改代码后不会立即生效,需要重启服务才可以。如果频繁的执行修改特别是页面样式的修改等,非常浪费时间。因此,Spring Boot框架为我们提供了热部署这样一个机制,从而实现项目的重启无需人工干预,可以自动完成。默认是没有热部署的,需要配置生效才可以

    热部署配置步骤

    引入热部署依赖启动器JarIDEA配置支持热部署功能

    添加热部署依赖启动器

    <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>

    配置IDEA工具热部署设置

    菜单:File -> Settings 然后如下配置 选择OK生效即可。

    在项目中使用快捷键:Ctrl+Shift+Alt+/打开页面,选择Registry

    ​ 经过上诉的2个步骤配置,热部署功能就生效了。我们可以启动项目,访问页面http://localhost:8080/demo/sayHello 返回的值为Hello World。然后修改返回值为:Hello Java。刷新浏览器就可以看到最新的结果。

    热部署原理

    热部署的实现原理就是当我们的应用修改后,IDEA自动重启应用而不用人工手动执行。

    1.5 配置文件

    ​ 在Spring Boot构建的项目中,不需要任何配置都可以启动,这是由于Spring Boot对于各种框架属性配置都有默认的值。当然Spring Boot也支持属性自定义,例如:在刚才的项目中修改启动端口为9090。

    ​ 在构建完成的Spring Boot项目resources下有个application.properties配置文件,可以在此配置信息。Spring Boot的配置文件支持2种格式properties或者yaml(yml)。两种格式参数都是一样,只是书写格式有变化。

    # 指定启动端口为9090 server.port=9090 # 项目重启后可以看到Tomcat的端口修改为了9090 2020-09-26 21:02:38.988 INFO 2328 --- [ restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 9090 (http) with context path ''

    1.5.1 application.properties配置文件

    application.properties配置文件的格式为:a.b.c=值。

    server.port=9090 spring.application.name=spring-boot-demo

    1.5.1.1 application.properties自定义配置信息

    普通属性注入

    person.name=jack person.age=18

    定义注入的Bean

    // 先定义实体 @Component // person类将交由spring创建实例 // 引入配置文件,并且指定前缀,这样就会在配置文件中找person前缀的属性 @ConfigurationProperties(prefix = "person") public class Person { // 注入配置文件的person.name属性 private String name; // 注入配置文件的person.age属性 private String age; // getter/setter }

    修改DemoController

    @RestController public class DemoController { // 注入Person类 @Autowired private Person person; // 返回person,看里面的值是不是配置文件的 @GetMapping("/demo/properties") public Object properties() { return person; } }

    ​ 到目前为止,我们已经完成了Spring Boot项目的默认属性配置修改(server.port),和自定义配置信息(person)的注入功能。这些都是简单的功能注入,接下来我们将介绍复杂的配置属性注入。

    List/数组注入

    对于集合或者数组类型的配置,多个值之间使用逗号隔开

    # 集合配置 person.hobby=学习,睡觉,做饭 # 数组配置 person.family=father,mother

    Person添加属性

    @Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private String age; private List hobby; private String[] family; // getter setter }

    Map注入

    Map是键值对格式的数据,如:key1=value1,key2=value2。在properties配置文件也是类似的。

    # Map配置 person.map.key1=value1 person.map.key2=value2

    Person添加属性

    package com.example.demo; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /** * Author: zhi chun qiu * date: 2020/9/26 21:15 */ @Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private String age; private List hobby; private String[] family; private Map map; // getter setter }

    对象注入

    ​ 下面将介绍如果将配置文件的值注入到实体内部的Bean中。其实经过上面的Map和List对象的注入,可以猜到对象注入和Map等都是类似的。

    # Bean注入 person.pet.type=cat person.pet.name=big-eat

    定义一个Pet对象

    public class Pet { private String type; private String name; // getter setter }

    在Person中引入Pet

    @Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private String age; private List hobby; private String[] family; private Map map; private Pet pet; }

    1.5.2 application.yaml配置文件

    Yaml文件格式是Spring Boot支持的一种类式JSON的超集文件格式,相比较与properties配置文件,Yaml配置文件关注数据,使用更加简洁。

    Yaml文件的扩展名可以是yaml或者ymlapplication.yml文件格式为key: value。yaml则使用缩进控制层级关系

    格式演示

    server: port: 9090

    集合/数组注入格式

    # 格式一 person: hobby: - play - study - sleep # 格式二 person: hobby: play, study sleep # 格式三 person: hobby: [play,study,sleep]

    Map注入格式

    # 格式一 person: map: key1: value1 key2: value2 # 格式二 person: map: {key1: value1, key2: value2}

    对象注入格式

    person: pet: {type: cat, name: big-eat}

    1.6 配置文件属性注入

    # 统一配置文件,下面的注入方式都基于这个配置文件值注入,这里展示基础属性注入 person.name=jack person.age=18

    1.6.1 @ConfigurationProperties方式

    ​ @ConfigurationProperties方式注入配置文件属性,是基于Java Bean的。这样可以实现批量注入并且在需要的地方引入对象即可使用。

    @Component @ConfigurationProperties(prefix = "person") public class Person { private String name; private String age; // getter setter }

    1.6.2 @Value方式

    ​ @Value是Spring提供的注解,这种读取配置文件的方式是在需要使用的地方单独注入。当然也可以统一注入到某个Java Bean,在需要使用的地方引入对象即可。

    @Component public class Person { @Value("${person.name}") private String name; @Value("${person.age}") private String age; }

    Spring Boot学习思维导图

    知春秋 认证博客专家 博客专家 Java高级研发 不忘初心,方得始终。初心易得,始终难守。
    Processed: 0.010, SQL: 8