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

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框架为我们提供了热部署这样一个机制,从而实现项目的重启无需人工干预,可以自动完成。默认是没有热部署的,需要配置生效才可以

热部署配置步骤

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

添加热部署依赖启动器

<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或者yml
  • application.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学习思维导图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值