SpringBoot的使用(零基础入门基础篇)

Spring Boot的使用

这周是学习的Sprnig Boot的操作方法

Spring Boot 概念

Spring Boot提供了一种快速使用Spring的方式,基于约定优于配置的思想,可以让开发人员不必在配置于逻辑业务之间进行切换,全身心的投入到逻辑业务的代码编写中,从而大大提高了开发效率,一定程度上缩短了项目周期。

Spring :the source for modern java

App ->Spring Boot (Build)build anything -> Spring Cloud (Coordinate) coordinate anything -> Spring Cloud Data Flow (Connect) connect everything

Spring 的缺点

  • 配置繁琐

    Spring拥有轻量级的组件代码,但是配置却是重量级的,起初,Spring是使用XML的配置,然后启用了基于Java的配置替代了XML配置,从一定程度上减轻了Spring的配置负担。但是,这些配置仍然是代表着开发时的损耗。

  • 依赖繁琐

    在使用项目构建工具,构建Spring项目时,需要引入很多jar包,这些jar包之间的版本依赖性需要我们进行调节,这也是十分复杂的过程。

Spring Boot的功能

  • 自动配置

    Spring Boot的自动配置是一个应用程序启动时的过程,由Spring Boot 自动完成并决定Spring的配置选用。

  • 起步依赖

    起步依赖本质是一个Maven项目对象模型(Project Object Model, POM),定义了对其他库的传递依赖,这些东西加在一起就可以支持某项功能。即:起步依赖就是将某种功能的坐标打包到一起,并提供一些默认的功能。

  • 辅助功能

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

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

搭建Spring Boot工程

  1. 创建Maven项目
  2. 导入Spring Boot起步依赖
  3. 定义Contorller
  4. 编写引导类
  5. 启动测试

手动搭建Spring Boot项目

在了解搭建Spring Boot工程流程后,我们就手动进行一下搭建工程。

创建Maven项目

我们先创建一个Maven模块,

File -> New -> Module…

然后我们就在module选项中选择Maven的模块,选中SDK的版本,起名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Osq85TlR-1632461544818)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210922222428561.png)]

当我们完成创建Maven文件后,就进入到了pom文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yONk5OvR-1632461544820)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210922222452286.png)]

一个最初的Maven文件就创建好了。

导入Spring Boot起步依赖

在pom文件中,我们就要已引入相关的起步依赖与坐标,这些坐标可以在官方的文档中找到

Spring Boot官方使用手册

在官方手册的getting start 的 Installing Spring Boot 中可以找到Maven Installing 这里就有官方的Guidance book

Spring Boot Maven Plugin Documentation(Maven的官方使用手册)

这个地方我们可以找到pom文件起步依赖的一些模板

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6yzTSW73-1632461544822)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923172045264.png)]

我们就可以吧从这里获得的parent父项目拷贝下来粘贴过去

<!-- Spring Boot需要继承的父工程 -->
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.5.5</version>
</parent>

起步依赖已经添加了,我们可以在这里加入继续把web相关的坐标给依赖传递进来

<!-- web开发的起步依赖 -->
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

定义Contorller

在我们添加完起步依赖以后,我们终于可以开始写代码了,

先在main的java文件夹里创建一个类;

然后再写注解

@RestController
//这里我们在方法上访问,就不注解@RequestMapping
package com.kdny.java05;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController

public class CreaterController {
    
    

}

然后,我们在类里面写一个方法,并给方法上加入注解@RequestMapping,自己设置一个路径

@RequestMapping("/hello")
public String hello(){
    
    
    return "Hello Spring Boot !";
}

这个controller十分简单就是会执行这个hello的方法并返回字符串,这个方法的访问路径就是hello

为了可以启动这个项目,并访问这个方法,我们就要开始写个引导类

编写引导类

在编写引导类之前,我们要了解到引导类的类名结尾一般都是Aplication结尾。我们就先创建一个引导类,并加入引导类的注解,再写入main()方法,这里我们可以把引导类理解为Spring Boot项目的启动入口。

package com.kdny.java05;

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

@SpringBootApplication
public class HelloApplication {
    
    

    public static void main(String[] args) {
    
    
        SpringApplication.run(HelloApplication.class,args);
    }
}

引导类的编写就完成了,我们只需运行这里的main()方法,就可以启动整个Spring Boot工程

启动测试

这里就运行引导类

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jjBGc3lB-1632461544824)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923195749246.png)]

这个就是已经启动成功了,下面这些有些不同颜色的字样的就是Spring Boot的日志,我们可以看到这里有一个内置的Tomcat已经启动

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NycvN8AP-1632461544826)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923200056433.png)]

在8080这个端口,我们就可以打开浏览器去访问一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vZIs5XTq-1632461544827)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923200228433.png)]

我们可以看到这个字符串已经可以成功的在浏览器上被访问到。

自动生成Spring Boot工程

刚刚我们手动进行了Spring Boot工程的搭建,也许已经注意到了,我们在pom.xml文件中并没有去指定工程的打包方式,这里我们要注意:Spring Boot在创建项目时,是使用jar的打包方式,因为Spring Boot项目的入口是通过运行main方法来启动的。既然是使用jar包的打包方式,那就说明我们可以直接用Idea引入创建好了的Spring Boot基础工程。这样就不需要我们去写pom文件,及引导类。

这里我们可以直接使用Idea去自动生成Spring Boot的工程,就是在new Module中选择Spring Initializr,然后就可以进行填写项目信息

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQvSAkki-1632461544828)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923201923812.png)]

这里可以看到Idea需要进行访问这个默认网页,我们也可以直接使用这个网址进行构造Spring Boot的工程。

Spring Initializr

这个就是这个网页
在这里插入图片描述

工程建立完成后,因为这个是以jar的形式进行打包,我们就可以把这个jar包导入到Idea中,并关联上Maven
在这里插入图片描述
再编写一个引导类
在这里插入图片描述

就可以进行测试了
在这里插入图片描述

Spring Boot的配置

配置文件的分类

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用application.properties或者application.yml (application.yaml)进行配置。

  • properties

server.port = 8080;

  • yml

server:

​ port: 8080

yml里需要注意键和值之间是有一个空格的

使用 properties

打开Spring Boot工程,在resources中我们可以找到application.properties的文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5ReCnzJa-1632461544832)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923205521806.png)]

在这里我们就可以改变默认值,比如:把port改成8082

server.port=8082

运行一下,就可以看到,端口已经改变了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-M36NltHX-1632461544833)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923205644681.png)]

在application.properties中我们除了可以配置原有的属性之外,我们还可以配置自己定义的属性,但是这就需要我们在程序中写下自定义的加载、读取、配置方法。

使用yml

使用yml的方式修改原始的配置,我们需要在resource文件夹下创建一个application.yml的文件

然后就可以进行更改操作

server:
  port: 8089

重新启动引导类,就可以看到端口改变为了8089

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rGfS40zl-1632461544834)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923210312063.png)]

yml中还有yaml的后缀名,这个操作也是一样的,就不在操作了。

配置加载顺序

在多个配置文件同时存在时

properties的优先级高于yml高于yaml

低优先级中的配置如有和高优先级的配置重复的地方会被忽视。

我们可以测试一下,把之前两个配置文件同时写上,启动运行后,port是properties定义的8082

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bFcs2sfU-1632461544835)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923210938473.png)]

yaml

YAML全称是 YAML Ain’t Markup Language 。YAML是一种直观的能够被电脑识别的的数据数据序列化格式,并且容易被人类阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入,比如: C/C++, Ruby, Python, Java, Perl, C#, PHP 等。YML文件是以数据为核心的,比传统的xml方式更加简洁。

YAML文件的扩展名可以使用.yml或者.yaml。

  • properties
server.port = 8080;
server.address = 127.0.0.1
  • xml
<server>
	<port>8080</port>
	<address>127.0.0.1</address> 
</server>
  • yaml
server: 
	port: 8080 
	address: 127.0.0.1

我们可以看到,使用properties书写的时候,我们难以直观的看到这些属性之间的层级关系;使用xml我们可以看到层级关系但是比较复杂;而yaml既可以看到层级关系,还简洁,以数据为核心。

yaml的基本语法

  • 大小写敏感

  • 数据值前边必须有空格,作为分隔符

  • 使用缩进表示层级关系

  • 缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • ‘#’ 表示注释,从这个字符一直到行尾,都会被解析器忽略。

yaml的数据格式

yaml中有三种不同的数据格式

  • 对象(map):键值对的集合。
person:
	name: GXY
# 行内写法
person: {
    
    name: GXY}
  • 数组:一组按次序排列的值
address:
-	beijing
-	shanghai
# 行内写法
address: [beijing,shanghai]
  • 纯量:单个的、不可再分的值
msg1: 'hello \n world'  # 单引忽略转义字符 
msg2: "hello \n world"  # 双引识别转义字符,分两行输出

yaml的参数引用

这里我们定义了一个参数,在后面我们需要引用就可以使用这种方式进行参数引用

name: GXY # 定义name值为GXY

person:
	name: ${
    
    name} # 引用上边定义的name值

读取配置文件

刚刚我b们进行了配置文件的编写,现在我们要进行将配置文件中的内容给读取出来

Spring Boot提供了三种读取配置文件内容的方式

  • @Value
  • Environment
  • @ConfigurationProperties

@Value

我们在yml的配置文件中,定义一个person的对象,我们就在Controller中读取出来

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LZ0385zT-1632461544836)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923214716853.png)]

并且,再把读取过来的对象打印出来

@Value("${person.name}")
	private String name;

	@Value("${person.age}")
	private int age;

	@RequestMapping("/person")
	public void outputPerson() {
    
    
		System.out.println(name);
		System.out.println(age);
	}

现在,我们可以启动引导类测试一下,运行一下,成功了

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PXcgVE2-1632461544837)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923221202539.png)]

然后,我们所需要的配置属性也进行了输出

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lQSDoY3k-1632461544838)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923221254824.png)]

注意:当数组要进行输出的时候,我们是要一个元素一个元素的输出,@Value("${array[脚标]}")

Environment

上面我们使用@Value的方法获取配置文件的值,过程还是有些麻烦,要把值一个一个的注入,这个方法获取单个的值是比较方便的,但当我们要获取更多的值的时候就变的异常麻烦。这里我们使用Environment的方式.

该方式就是直接注入一个Environment环境的一个对象(是spring framework包中的)

@Autowired
private Environment environment;

然后就在下面的获取方法中,使用对象获取键的值

@RequestMapping("/person")
    public String outputPerson() {
    
    
        System.out.println(name);
        System.out.println(age);

        System.out.println("*******below is Environment*******");
        System.out.println(environment.getProperty("person.name"));//getProperty("是待读取的值的键")
        System.out.println(environment.getProperty("person.age"));
        return "hello Spring Boot";
    }

测试一下读取结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tVWxFwjs-1632461544838)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923223358727.png)]

@ConfigurationProperties

使用@ConfigurationProperties读取配置文件,其实是一种将配置内容和对象进行相互绑定的一种方式。前两个方式是将属性单独的注入到我们需要使用的位置上,@ConfigurationProperties是将给属性创建一个对象,在我们配置内容的属性值就会自动的注入到该对象对应的位置上。

这里我们就要先创建一个属性类,这里按刚刚的person为例,并把内在属性写过来,并给这些属性变量添加getter和setter方法,为了便于打印还要加入toString的方法

package com.kdny.demo.controller;

public class Person {
    
    

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    private String name;
    private int age;

    @Override
    public String toString() {
    
    
        return "person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

为了让改类被spring识别,我们要加@Component的注解;然后在加上这个@ConfigurationProperties的注解

package com.kdny.demo.controller;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Component
@ConfigurationProperties
public class Person {
    
    

加上以后,我们会收到注解程序在类的路径下未找寻的警告,并不影响使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gBB5MTRH-1632461544839)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923225239610.png)]

我们在这个@ConfigurationProperties后面要添加前缀,这里就是person的前缀

@ConfigurationProperties(prefix = "person")

在Controller中,我们要把刚刚创建的person类用@Autowired注解注入,

@Autowired
private Person person;

然后注解注入的person对象打印出来

    public String outputPerson() {
    
    
        System.out.println(name);
        System.out.println(age);

        System.out.println("*******below is Environment*******");
        System.out.println(environment.getProperty("person.name"));
        System.out.println(environment.getProperty("person.age"));

        System.out.println("*****below is @ConfigurationProperties*******");
        System.out.println(person);
        return "hello Spring Boot";
    }

最后测试一下结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DKZnql0c-1632461544840)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210923235408729.png)]

现在,再来解决上面那个warming的问题,其实就是在pom中缺了一个对配置文件提示的依赖的添加,现在我们添加进去就行了,这样就可以在配置文件的编写中得到hint。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>

profile

我们在开发Spring Boot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。

1) profile配置方式

  • 多profile文件方式

  • yml多文档方式

2) profile激活方式

  • 配置文件

  • 虚拟机参数

  • 命令行参数

profile配置方式

多profile文件方式

多profile文件方式,我就先设置几个application文件,并在这些文件中设置不同的port

这里要注意application.properties文件的命名方式:application-XXX.properties

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0go1C5fz-1632461544841)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210924011346387.png)]

我们先运行,端口是8080,并且显示还没有激活profile

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JXoUd7L2-1632461544842)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210924011421286.png)]

我在application.properties这个主文件里面进行profile激活,这里可以选择激活的其他文件,这里先激活application-dev.properties文件

spring.profiles.active=dev

运行,我就可以看到dev已被激活,并且port切换成了dev文件中定义的8081

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bEaCCSt3-1632461544842)(C:\Users\GXY\AppData\Roaming\Typora\typora-user-images\image-20210924012003509.png)]

这是properties的多文件,yaml同样可以进行多文件配置。

yml多文档

yml多文档可以实现一个yml文件下实现多个不同环境下的配置

---

server:
  port: 8081

spring:
  profiles: dev
---

server:
  port: 8082

spring:
  profiles: test
---
server:
  port: 8083

spring:
  profiles: pro
---
spring:
  profiles:
    active: dev

这里这个三条杠是用来区分不同的环境

我们用spring.profiles给每一部分起名

spring:
  profiles: dev

然后,就是激活,激活操作和多profile文件操作相同在该yml文件下加入spring.profiles.active

spring:
  profiles:
    active: dev
profile激活方式
配置文件

上面已经展示了配置文件激活profile的方式,即在配置文件中,spring.profiles.active -待激活profile 文件

虚拟机参数

这一块还在继续学习中。。。。

l同样可以进行多文件配置。

yml多文档

yml多文档可以实现一个yml文件下实现多个不同环境下的配置

---

server:
  port: 8081

spring:
  profiles: dev
---

server:
  port: 8082

spring:
  profiles: test
---
server:
  port: 8083

spring:
  profiles: pro
---
spring:
  profiles:
    active: dev

这里这个三条杠是用来区分不同的环境

我们用spring.profiles给每一部分起名

spring:
  profiles: dev

然后,就是激活,激活操作和多profile文件操作相同在该yml文件下加入spring.profiles.active

spring:
  profiles:
    active: dev
profile激活方式
配置文件

上面已经展示了配置文件激活profile的方式,即在配置文件中,spring.profiles.active -待激活profile 文件

虚拟机参数

这一块还在继续学习中。。。。

猜你喜欢

转载自blog.csdn.net/qq_50459047/article/details/120453213