Spring Boot - part1

1. 环境

1.1 环境配置

  • 环境约束:

jdk 1.8
maven 3.6.0
IntelliJIDEA2017

  • Spring Boot 环境配置 博主写的非常详细!!

  • 由于我下载的IDEA是2017.3.1,版本和目前maven最新版本3.8.0 不匹配,会报Unable to import maven project错误,因此去下载了3.6.0版本,maven-3.6.0 下载地址

1.2 helloworld 实例

  1. 创建Spring Initializr 项目:

Create New Project —> Spring Initializr (选择SDK,版本要求1.8+)—> 填写项目信息 —> 选择初始化的组件【勾选Web依赖】 —> 选择项目的位置,点击【Finish】

  1. 项目结构如下 :
  • SpringbootApplication: 一个带有 main() 方法的类,用于启动应用程序
  • SpringbootApplicationTests:一个空的 Junit 测试了,它加载了一个使用 Spring Boot 字典配置功能的 Spring 应用程序上下文
  • application.properties:一个空的 properties 文件,可以根据需要添加配置属性
  • pom.xml: Maven 构建说明文件

在这里插入图片描述


2. 运行原理

2.1 Pom.xml

文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<!-- 父依赖 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.5</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.zou</groupId>
	<artifactId>springboot</artifactId>
	<version>0.0.1-SNAPSHOT</version>

	<name>springboot</name>
	<description>Demo project for Spring Boot</description>
	
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<!-- web场景启动器 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.4</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
		<!-- 打包插件 -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

父依赖
  • <parent>标签配置着 Spring Boot 的父级依赖,有了这个,当前项目才是Spring Boot 项目。
  • spring-boot-starter-parent 是一个特殊的 starter ,它用来提供相关的 Maven 默认依赖,使用它之后,常用的包依赖就可以省去 version 标签
<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>2.4.5</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>
启动器
  • spring-boot-starter - xxx:场景启动器,xxx代表某种场景。
  • SpringBoot 将所有的功能场景都抽取出来,做成一个个 start 启动器,只要在项目中引入了某个 starter,这个场景的所有常规需要的依赖都会自动引入。
<!-- -web 帮我们导入了web模块正常运行所依赖的组件 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.2 应用入口类 @SpringBootApplication

Spring Boot 项目通常有一个名为 *Application 的入口类,入口类里有一个 main 方法, 这个 main 方法其实就是一个标准的 Java 应用的入口方法。

   标注在某个类上说明这个类是SpringBoot的主配置类 , SpringBoot就应该运行这个类的main方法来启动SpringBoot应用

   Spring Boot 的核心注解,他是一个组合注解,该注解组合了:@Configuration@EnableAutoConfiguration@ComponentScan; 若不是用 @SpringBootApplication 注解也可以使用这三个注解代替。

  • @EnableAutoConfiguration: 让 Spring Boot 根据类路径中的 jar 包依赖为当前项目进行自动配置。 例如,添加了 spring-boot-starter-web 依赖,会自动添加 Tomcat 和 Spring MVC 的依赖,那么 Spring Boot 会对 Tomcat 和 Spring MVC 进行自动配置。

  • @ComponentScan: 对应XML配置中的元素。
    作用:自动扫描并加载符合条件的组件或者bean , 将这个bean定义加载到IOC容器中。

  • @Configuration:说明这是一个配置类 ,配置类就是对应Spring的xml 配置文件。


3. 配置文件

3.1 配置文件介绍

Spring Boot 使用一个全局的配置文件 ,

  • application.properties
    语法结构: key=value
  • application.yml
    语法结构: key: value (冒号后面有个空格!)

存放位置:【src/main/resources】目录或者类路径的 /config 下。
配置文件的作用 :修改SpringBoot自动配置的默认值,因为SpringBoot在底层都给我们自动配置好了。


3.2 YAML概述

yaml 是以数据为中心的语言,在配置数据的时候具有面向对象的特征。

基本语法

k:(空格)v:表示一对键值对(空格必须有);
以空格的缩进来控制层级关系;只要是左对齐的一列数据,都是同一个层级的。

server:
  port: 8081
  path: /hello
值的写法
  1. 字面量:普通的值(数字、字符串、布尔)
    k: v:字面直接来写;
    字符串默认不用加上单引号或者双引号;
    "":双引号;不会转义字符串里面的特殊字符;
    特殊字符会作为本身想表示的意思
    ’’:单引号;会转义特殊字符,特殊字符最终只是一个普通的字符串数据
name: "zhangsan \n lisi": 输出;zhangsan 换行 lisi 
name: ‘zhangsan \n lisi’: 输出;zhangsan \n lisi
  1. 对象、Map(属性和值)(键值对)
    k: v:在下一行来写对象的属性和值的关系;注意缩进。
# 块写法
friends:
	lastName: zhangsan 
	age: 20
# 行内写法
friends: {lastName: zhangsan,age: 18}
  1. 数组(List、Set)
    用- 值 表示数组中的一个元素
# 块写法
pets: 
	‐ cat 
	‐ dog 
	‐ pig
# 行内写法
pets: [cat,dog,pig]

3.3 注入配置文件

  1. 在springboot 项目中的 resources 目录下新建一个文件 application.yml
  2. 在 pojo 包下创建 Dog 类
package com.zou.springboot.pojo;

import org.springframework.stereotype.Component;

@Component //注册bean到容器中
public class Dog {
    private String name;
    private String age;
	
	//有参无参构造、get、set方法、toString()方法
    public Dog() {
    }

    public Dog(String name, String age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public String getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
}
  1. 采用 @Value 方法,给bean注入属性值
@Component //注册bean
public class Dog {
    @Value("阿黄")
    private String name;
    @Value("18")
    private String age;
  1. 在SpringBoot 的测试类下注入狗狗输出一下
@SpringBootTest
public class DemoApplicationTests {
    @Autowired	//将狗狗自动注册进来
    Dog dog;
    @Test
    public void contextLoads(){
        System.out.println(dog); //打印查看狗狗对象
    }
}

dog 组件
5. 编写一个复杂的实体类: Person类

@Component // 注册bean

public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    
	//有参无参构造、get、set方法、toString()方法
}
  1. 使用yaml配置的方法进行注入
person:
  name: 邹小胖
  age: 20
  happy: true
  birth: 2000/09/28
  maps: {k1: v1,k2: v2}
  lists:
    - krystal
    - 连小伟
  dog:
    name: 旺财
    age: 1
  1. 把person这个对象的所有值,注入到我们的类中!

@ConfigurationProperties作用:

  • 将配置文件中配置的每一个属性的值,映射到这个组件中;
  • 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定
  • 参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;
    private Boolean happy;
    private Date birth;
    private Map<String,Object> maps;
    private List<Object> lists;
    private Dog dog;
}
  1. IDEA 提示,springboot配置注解处理器没有找到,需要一个依赖!
    错误
<!-- 导入配置文件处理器,配置文件进行绑定就会有提示,需要重启 -->
<dependency> 
	<groupId>org.springframework.boot</groupId> 
	<artifactId>spring-boot-configuration-processor</artifactId> 	
	<optional>true</optional> 
</dependency>
  1. 去测试类中进行测试
@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    Person person;
    @Test
    public void contextLoads(){
        System.out.println(person);
    }
}

注入成功注: 将配置文件的key 值 和 属性的值设置为不一样,则结果输出为null,注入失败

3.4 加载指定配置文件

@PropertySource :加载指定的配置文件;
@configurationProperties:默认从全局配置文件中获取值;

  1. 在resources目录下新建一个person.properties文件
name=邹小胖
  1. 在 Person.class 中指定加载 person.properties 文件
@Component
@PropertySource(value="classpath:person.properties")

public class Person {
    @Value("${name}")
    private String name;
    private Integer age;
    ·······
}

person

4. 配置文件补充

4.1 JSR303 数据校验

Springboot中可以用@validated来校验数据,如果数据异常则会统一抛出异常,方便异常中心统一处理。

实例

例:写个注解让 name 只能支持Email格式

  1. 在 pom.xml 添加依赖
<dependency>
    <groupId>org.hibernate.validator</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.0.Final</version>
</dependency>
  1. 编写代码
@Component
@ConfigurationProperties(prefix = "person")
@Validated //数据校验
public class Person {
    @Email(message="邮箱格式错误")
    private String name;
    ······
}

匹配失败空值错误

常见的检查

空值检查

  • @Null 验证对象是否为null
  • @NotNull 验证对象是否不为null, 无法查检长度为0的字符串
  • @NotBlank 检查约束字符串是不是Null还有被Trim的长度是否大于0,只对字符串,且会去掉前后空格.
  • @NotEmpty 检查约束元素是否为NULL或者是EMPTY.

Booelan检查

  • @AssertTrue 验证 Boolean 对象是否为 true
  • @AssertFalse 验证 Boolean 对象是否为 false

长度检查

  • @Size(min=, max=) 验证对象(Array,Collection,Map,String)长度是否在给定的范围之内
  • @Length(min=, max=) string is between min and max included.

日期检查

  • @Past 验证 Date 和 Calendar 对象是否在当前时间之前
  • @Future 验证 Date 和 Calendar 对象是否在当前时间之后
  • @Pattern 验证 String 对象是否符合正则表达式的规则

4.2 yaml 和 properties 对比

对比配置yml和配置properties都可以获取到值 , 强烈推荐 yml;
如果我们在某个业务中,只需要获取配置文件中的某个值,可以使用一下 @value;
如果说,我们专门编写了一个JavaBean来和配置文件进行一一映射,就直接@configurationProperties,不要犹豫!

4.3 多环境切换

profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境;

多配制文件

在主配置文件编写的时候,文件名可以是 application-{profile}.properties/yml , 用来指定多个环境版本;

例如:application-test.properties 代表测试环境配置 application-dev.properties 代表开发环境配置

但是Springboot并不会直接启动这些配置文件,它默认使用application.properties主配置文件;需要通过一个因此配置来选择需要激活的环境:

#比如在配置文件中指定使用dev环境,我们可以通过设置不同的端口号进行测试; 
#我们启动SpringBoot,就可以看到已经切换到dev下的配置了; 
spring.profiles.active=dev
yml的多文档块

使用yml去实现不需要创建多个配置文件

server:
  port: 8081
#选择要激活那个环境块
spring:
  profiles:
    active: prod

---
server:
  port: 8083
spring:
  config:
      activate:
        on-profile: dev #配置环境的名称

---
server:
  port: 8084
spring:
  config:
      activate:
        on-profile: prod #配置环境的名称

4.4 配置文件加载位置

springboot 启动会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件

优先级1:项目路径下的config文件夹配置文件
优先级2:项目路径下配置文件
优先级3:资源路径下的config文件夹配置文件
优先级4:资源路径下配置文件

优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载主配置文件;互补配置;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值