Spring Boot 框架

文章目录

    • 一、Spring Boot
      • - 1.定义
      • - 2.特点
      • - 3.项目创建
      • - 4.项目版本
      • - 5.关于项目报错说明
      • - 6.SpringBoot全新的pom.xml
      • - 7.SpringBoot的高级
        • - - 1.pom.xml文件说明
      • - 8.IDEA第一个SpringBoot Project
        • - - 1.创建SpringBoot project
        • - - 2.IDEA中配置Maven(看Maven帖子)
        • - - 3.检查:
        • - - 2.给服务器添加资源
        • - - 3.测试
      • - 9.SpringBoot高级用法
        • - - 1.yml文件(整合第三方的) 为属性赋值
          • - - - 1.需求说明
          • - - - 2.编辑YML文件 application.yml
          • - - - 3.编辑HelloController
          • - - - 4.页面效果展现
        • - - 2.properties文件(梳理业务逻辑的) 为属性赋值
          • - - - 1.业务说明
          • - - - 2.编辑properties文件 msg.properties
          • - - - 3.动态为属性赋值
          • - - - 4.页面展示效果
      • - 10.项目发布
      • - 11.SpringBoot 注意事项
        • - - 1.关于Build标签说明
        • - - 2.关于主启动类(@SpringBootApplication)说明
          • 1.关于元注解的说明
          • 2.@ComponentScan说明
          • 3.@SpringBootConfiguration注解说明
            • - 3.1 说明1 @Configuration --- 标记这个类就是一个配置类
            • - 3.2 说明2 @SpringBootConfiguration修饰主启动类,说明主启动类也是一个配置类。
            • - 3.3 说明3 SpringBoot主启动类会扫描用户自己的配置类,并且实例化对象。
          • 4.@EnableAutoConfiguration注解说明
            • - 4.1 @AutoConfigurationPackage说明
            • - 4.2 @Import(AutoConfigurationImportSelector.class)
            • - - 流程说明(重点!!!)
          • 5.主启动类注解结构图
          • 6. 关于依赖考题
      • - 12.环境切换
      • - 13.SpringBoot测试类用法(Spring中IOC和DI的底层原理)
        • - - 1.业务说明
        • - - 2.编辑配置类 UserConfig.java(IOC的底层知识)
          • Spring管理对象原理(IOC的底层知识)
        • - - 3.编辑测试类TestSpring.java (DI的底层知识)
          • Spring对象注入原理(DI的底层知识)
      • - 14.拓展
        • - - 拓展1:
        • - - 拓展2:
      • - 15.常见问题:8080端口冲突
      • - 16.扩展:请求响应的过程
        • - - 1.HTTP协议
        • - - 2.执行过程
        • - - 3.谷歌浏览器查看请求响应信息
        • - - 4.头信息
        • - - 5.响应头
        • - - 6.请求头

一、Spring Boot

- 1.定义

  • 是一个Maven项目的延伸,也拥有pom.xml
  • 优势:简化了Maven的操作,嵌入了Tomcat

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。
Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。成为SpringBoot全家桶。

- 2.特点

  • 创建独立的Spring应用程序
  • 嵌入的Tomcat,无需部署WAR文件
  • 简化Maven配置
  • 自动配置Spring
  • 提供生产就绪型功能,如指标,健康检查和外部配置

- 3.项目创建

Spring Boot 框架_第1张图片

- 4.项目版本

Spring Boot 框架_第2张图片

- 5.关于项目报错说明

如果项目中出现parent标签报错/插件报错说明:
Spring Boot 框架_第3张图片
1.parent标签报错:
Spring Boot 框架_第4张图片
2.maven插件报错
Spring Boot 框架_第5张图片

- 6.SpringBoot全新的pom.xml

pom.xml

它产生整个项目目录,其实我们只需pom.xml文件,覆盖本地maven工程的pom.xml文件。

注:可以使用idea直接创建springboot项目,其本质也是去调用上面的网站,只不过在本地访问外网https://start.spring.io

修改pom.xml后,把项目进行maven-update 操作,下载依赖的jar包。


<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.0modelVersion>
	<groupId>cn.tedugroupId>
	<artifactId>jkartifactId>
	<version>0.0.1-SNAPSHOTversion>
	<name>jkname>
	<description>Demo project for Spring Bootdescription>

  	
	<parent>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-parentartifactId>
		<version>2.4.2version>
		<relativePath/> 
	parent>
	
	<properties>
		
		<java.version>1.8java.version>
		
		<skipTests>trueskipTests>
	properties>
	
	
	<dependencies>
		
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-webartifactId>
		dependency>
		
		
		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-testartifactId>
			<scope>testscope>
		dependency>
		
	dependencies>
	<build>
		
		<plugins>
			
			<plugin>
				<groupId>org.springframework.bootgroupId>
				<artifactId>spring-boot-maven-pluginartifactId>
			plugin>
		plugins>
	build>

project>

- 7.SpringBoot的高级

- - 1.pom.xml文件说明
	
	<groupId>com.jtgroupId>
	<artifactId>springboot_demo01artifactId>
	<version>0.0.1-SNAPSHOTversion>
	<name>springboot_demo01name>
	<description>Demo project for Spring Bootdescription>

parent标签的作用

	
	<parent>
		<groupId>org.springframework.bootgroupId>
		<artifactId>spring-boot-starter-parentartifactId>
		<version>2.5.3version>
		<relativePath/> 
	parent>

dependency标签作用

	
	<dependencies>
		<dependency>
			<groupId>org.springframework.bootgroupId>
			
			<artifactId>spring-boot-starter-webartifactId>
		dependency>

		<dependency>
			<groupId>org.springframework.bootgroupId>
			<artifactId>spring-boot-starter-testartifactId>
			<scope>testscope>
		dependency>
	dependencies>

build标签作用

	
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.bootgroupId>
				<artifactId>spring-boot-maven-pluginartifactId>
				<version>2.5.3version>
			plugin>
		plugins>
	build>

- 8.IDEA第一个SpringBoot Project

- - 1.创建SpringBoot project

File - New - Project - 选择Spring Initializr - next - 输入Group名和Artifact名和选择java8 - next - 选中Spring(Spring Web) - next - ok
Spring Boot 框架_第6张图片

Spring Boot 框架_第7张图片
Spring Boot 框架_第8张图片

- - 2.IDEA中配置Maven(看Maven帖子)
- - 3.检查:

Spring Boot 框架_第9张图片
Spring Boot 框架_第10张图片

- - 2.给服务器添加资源

Spring Boot 框架_第11张图片

package cn.tedu.cgb2106boot01;

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

@RestController //接受浏览器的请求 并返回json数据
public class HelloBoot {

    @RequestMapping("hi") //只匹配一个路径,规定了浏览器的地址栏怎么写
    public String hello(){
        return "hello spring boot";
    }
}
- - 3.测试
  1. 开启服务器(运行main方法)
  2. 打开浏览器访问: http://localhost:8080/hi (本机 端口号 要访问的资源)

Spring Boot 框架_第12张图片

- 9.SpringBoot高级用法

@Value为属性赋值

- - 1.yml文件(整合第三方的) 为属性赋值
- - - 1.需求说明

有时需要动态的获取数据,不能直接写死在代码中, 如何处理?
Spring Boot 框架_第13张图片

- - - 2.编辑YML文件 application.yml
# 语法说明
## 语法1: 数据结构 -- key-value结构
## 语法2: 写法 -- key:(空格)value
## 语法3: yml文件 -- 默认字符集是UTF-8 中文部乱码
## 语法4: yml文件 -- 有层级效果 注意缩进
server:
  port: 8080

# SpringBoot启动时 默认加载yml文件
msg:
  hello: "今天下雨,记得打伞。~~~"
- - - 3.编辑HelloController
package com.jt.springboot_demo01.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    /**
     * 规则:
     *      1. 当Spring容器启动时,会加载yml配置文件。会将内部的key-value结构 加载到spring维护的内存空间中
     *      2. @Value功能,从spring容器中根据key 动态赋值
     *      3. springel表达式 简称:spel
     * 使用场景:
     *      如果代码中需要给成员变量赋值时,一般采用动态的赋值方式
     */
    @Value("${msg.hello}")
    private String msg;

    @RequestMapping("get")
    public String get(){
        return msg;
    }
}
- - - 4.页面效果展现

Spring Boot 框架_第14张图片

- - 2.properties文件(梳理业务逻辑的) 为属性赋值
- - - 1.业务说明

业务优势会大量动态赋值,如果将大量业务数据写入到yml文件中,会导致代码混乱,最好的方式指定properties文件,为业务赋值

- - - 2.编辑properties文件 msg.properties
# 语法1:
# 数据结构: key-value
# 注意事项:不要添加 "" 号,本身就是字符串.
# 字符集编码:写法采用utf-8,程序读取采用ISO-8859-1
pro.msg=配置信息
- - - 3.动态为属性赋值
package com.jt.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
//spring负责加载指定的配置文件
//如果注解中只需要一个属性,名称为value,则可以省略不写,但又多个属性时,不可以省略
@PropertySource(value="classpath:/msg.properties",encoding = "utf-8") //只要看到xxxSource注解就写classpath:/,格式(classpath:是加载的意思)
public class HelloController {
    /**
     * 规则:
     *      1. 当Spring容器启动时,会加载yml配置文件。会将内部的key-value结构 加载到spring维护的内存空间中
     *      2. @Value功能,从spring容器中根据key 动态赋值
     *      3. springel表达式 简称:spel
     *  使用场景:
     *      如果代码中需要给成员变量赋值时,一般采用动态的赋值方式
     */
    @Value("${msg.hello}")
    private String msg;
    @Value("${pro.msg}")
    private String proMsg;

    @RequestMapping("get")
    public String get(){
        return msg+ "||"+ proMsg;
    }
}
- - - 4.页面展示效果

Spring Boot 框架_第15张图片

- 10.项目发布

  1. 进入jar包根目录

Spring Boot 框架_第16张图片

  1. 前提:必须得正确配置JDK

说明: 通过 java -version 检查JDK是否配置正常.
如果提示java不是内部命令 则环境变量配置一定有问题.
Spring Boot 框架_第17张图片
环境变量配置:
Spring Boot 框架_第18张图片

  1. 项目发布

    命令:java -jar xxx.jar

    Spring Boot 框架_第19张图片

  2. 项目关闭问题

如果项目发布成功之后,需要关闭。则直接关闭dos命令窗口即可。
如果依然不能正常关闭,则杀死进程/或者重启计算机。

Spring Boot 框架_第20张图片
右键结束进程项即可
Spring Boot 框架_第21张图片

  1. 关于dos命令窗口锁定问题

说明:当通过dos命令 启动tomcat服务器时,可能由于误操作。锁定当前dos窗口
解决方案:万能取消指令 ctrl + c

- 11.SpringBoot 注意事项

- - 1.关于Build标签说明

如果没有build标签则项目打包之后不能正常执行。报错如下
Spring Boot 框架_第22张图片

- - 2.关于主启动类(@SpringBootApplication)说明
1.关于元注解的说明

@Target(ElementType.TYPE) — 该注解对类有效
@Retention(RetentionPolicy.RUNTIME) — 该注解在运行期有效
@Documented — 生成源码时 是否动态生成注释文档
@Inherited — 标识注解是否可以被继承

2.@ComponentScan说明

说明:当SpringBoot启动时,会实例化很多的对象,但是需要排除特定的类型
原因:SpringBoot内部兼容了很多的第三方框架,但是其中个别加入之后会影响整个代码流程,所以通过这样的方式将个别的类排除在外。

@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
3.@SpringBootConfiguration注解说明
- 3.1 说明1 @Configuration — 标记这个类就是一个配置类

关键词:配置文件/配置类
作用:整合第三方框架(配置)
@Configuration: 该注解一般标识类文件,告知SpringBoot程序 这个类是用来整合第三方框架/配置的。
Spring Boot 框架_第23张图片

- 3.2 说明2 @SpringBootConfiguration修饰主启动类,说明主启动类也是一个配置类。

Spring Boot 框架_第24张图片

- 3.3 说明3 SpringBoot主启动类会扫描用户自己的配置类,并且实例化对象。

Spring Boot 框架_第25张图片

4.@EnableAutoConfiguration注解说明

说明: 自动化的配置如图所示:
Spring Boot 框架_第26张图片

- 4.1 @AutoConfigurationPackage说明

该注解表示自动配置的包扫描的路径.
工作原理: 该注解会动态的获取主启动类当前的包路径.之后开启包扫描的机制.
知识点: 以后写代码都应该在主启动类的同包及子包中.

- 4.2 @Import(AutoConfigurationImportSelector.class)

知识回顾: SpringBoot使用体现了"开箱即用"的思想,用户引入jar包之后 可以直接使用(少量配置).
思考: dependencies代表程序的依赖项,(将其他的包加载到自己的项目中), 只是加载不负责执行.

- - 流程说明(重点!!!)

当SpringBoot主启动项执行时,内部会加载@Import(AutoConfigurationImportSelector.class),
该注解的作用就是根据依赖信息,根据SpringBoot内部的配置信息,依次加载执行.
当匹配了用户添加的启动器之后,程序负责实例化框架(执行jar包中的内容).
如果匹配不到,则继续向下执行.最终SpringBoot程序加载成功.
Spring Boot 框架_第27张图片

5.主启动类注解结构图

Spring Boot 框架_第28张图片

6. 关于依赖考题

问题: 用户暂时不需要数据库的配置. 问:能否先行添加数据源的启动项?? (不添加任何注解!!!)
答案: 不可以,因为启动项执行需要完整配置,数据源信息并未添加.导致报错.

总结: SpringBoot项目中的依赖包尤其启动项,添加时慎重. 如果需要添加启动器,则必须保证配置完整(当匹配了用户添加的启动器之后,程序负责实例化框架(执行jar包中的内容)).否则程序启动必然失败!!!.
Spring Boot 框架_第29张图片

- 12.环境切换

要求: 不管是几个环境,要求配置项都必须相同,值可以不同
语法:
1.使用 - - - 实现YML配置文件的分割
2.定义环境名称
3.定义默认环境名称

#指定默认的环境
spring:
  profiles:
    active: test
---

#关于YML配置文件说明
# 1.数据结构    key=value
# 2.数据类型    默认都是字符串 如果需要类型转化,则框架已经在内部完成
# 3.yml写法:   1.key: (空格)value  2.有层级结构 编辑时注意
# 4.字符集编码: 默认程序加载时都是UTF-8
#定义环境名称
spring:
  config:
    activate:
      on-profile: dev

server:
  port: 8080
  #项目发布的路径
  servlet:
    #  /缺省值  localhost:8080/jt/xxxx请求路径
    context-path: /

#2.为属性赋值  hello代表前缀    key=hello.msg
hello:
    msg: "我喜欢开发"

#环境分割线
---
spring:
  config:
    activate:
      on-profile: test

server:
  port: 8090
  #项目发布的路径
  servlet:
    #  /缺省值  localhost:8080/jt/xxxx请求路径
    context-path: /

#2.为属性赋值  hello代表前缀    key=hello.msg
hello:
  msg: "我喜欢测试"

- 13.SpringBoot测试类用法(Spring中IOC和DI的底层原理)

- - 1.业务说明

说明:有时由于业务需要,需要进行单元测试,单元测试中的对象可能会依赖Spring容器
需求:需要Spring容器管理一个User对象,id=101 name=“张三”
分析:难点:定制化属性的内容!!! 具体的业务功能.利用配置类实现!!!

- - 2.编辑配置类 UserConfig.java(IOC的底层知识)
Spring管理对象原理(IOC的底层知识)

Spring容器怎么管理对象???
IOC管理对象的2种方式
– 1.层级代码用@Controller等注解
– 2.业务需求用 @Configuration + @Bean

package com.jt.config;

import com.jt.pojo.User;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

//配置类
//作用:将自己需要的对象交给Spring容器管理
@Configuration //标记这是一个配置类
public class UserConfig {
    /**
     * 思路:1.Spring内部维护了一个Map集合
     *      2.Map集合key/value 分别是谁???
     *                      --  key是方法名,value是方法的返回值 Map
     *      3.IOC管理对象的2种方式
     *                      -- 1.层级代码用@Controller等注解
     *                      -- 2.业务需求用 @Configuration + @Bean
     *
     * 1.注解组合:@Configuration + @Bean
     * 2.什么是bean? -- 被Spring管理的对象
     * 3.@Bean注解的作用
     *      将方法的返回值对象交给Spring管理
     * 4.Spring如何管理对象???
     *      数据结构:Map集合     Map
     *       key:对象的ID
     *       value:实例化之后的对象
     * demo1:Spring如何管理对象
     *         key是方法名
     *         value是方法的返回值
     *         Map
     * demo2:
     *      @Controller
     *      HelloController{}
     *      key:helloController     首字母小写
     *      value:Spring通过反射创建的HelloController对象
     */
    @Bean
    public User user2(){
        return new User(101,"张三");
    }
}
- - 3.编辑测试类TestSpring.java (DI的底层知识)
Spring对象注入原理(DI的底层知识)

Spring容器怎么依赖注入???
对象注入的方式:
1.构造方法注入
2.set方法注入
3.集合注入

set方法注入:

  1. 根据对象类型进行注入(默认规则)
    @Autowired
  2. 根据对象名称进行注入 - - 下面两个注解必须一起使用
    @Autowired
    @Qualifier(value = “user2”) – 这个value="???"的值是Map集合中的key

Spring Boot 框架_第30张图片

package com.jt;

import com.jt.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

/**
 * 原理说明:
 * 	1.当测试类执行时,会根据SpringBoot的配置动态启动Spring容器
 * 	2.当spring启动时,会加载所有的注解和配置类,最终将所有的对象交给Spring容器管理  Map集合
 * 	3.@SpringBootTest 通过这个注解,可以动态的从Spring容器中获取对象
 */
@SpringBootTest
class TestSpring {
	/**
	 * 对象注入的方式:
     *      1.构造注入
     *      2.Set注入
     *  
     * Set注入方式:
	 * 		1.根据类型注入(默认规则)
	 * 		2.根据名称注入 -- 下面两个注解必须一起使用
	 * 				@Autowired
	 *        		@Qualifier(value = "user2")  --  这个value="???"的值是Map集合中的key
	 */
	@Autowired //根据类型注入(默认规则)
//	@Qualifier("user2") // 根据名称注入
	private User user;

	@Test
	public void testUser(){
		System.out.println(user.toString());//User(id=101, name=张三)
	}
}

- 14.拓展

- - 拓展1:

Spring Boot 框架_第31张图片
url的解析执行过程:

浏览器输入的url,就会被解析后传入web中间件(/hi),web中间件再会进一步的解析,找到对应的Controller的某个注解里对应的url @RequestMapping({"/","/hi"}) ,从而就找到HelloController的hi()方法。最终利用反射执行这个类的方法(将来这个方法中就用来编写实现业务逻辑代码)。因为使用了@RestController,返回的String字符串对象底层会使用json工具类转换java对象为json字符串,返回给浏览器,浏览器将字符串回显(展示)在页面上。

- - 拓展2:

- 15.常见问题:8080端口冲突

Tomcat服务不会自动关闭,需要手动关闭,如不关闭,下次启动就会报下面错误:

port 8080 was already in use. 端口8080已经被占用。关闭服务,重新启动即可。
Spring Boot 框架_第32张图片
仍未解决的话,以下三种方式任选一个来测试.

1,需要执行DOS命令处理:

C:\Users\lpx>netstat –ano  --查看所有端口号,找到8080端口对应的PID号
C:\Users\lpx>taskkill -pid 688 –f --杀死688进程号 ```

2,可能是因为电脑里安装过Oracle数据库:

要找到Oracle的服务OracleXETNSListener,停掉.

3,直接使用yml方式配置修改端口号:
在src/main/resources下添加application.yml文件,内容如下:

server:
  port: 8090

清除项目缓存,再次重启服务,测试即可: http://localhost:8090/hi
Spring Boot 框架_第33张图片

- 16.扩展:请求响应的过程

- - 1.HTTP协议

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件、图片文件、查询结果等)。

- - 2.执行过程

怎么浏览器输入url就可以找到我们写的controller进行执行并且返回呢?

其实这底层是有一套标准的,这个标准称为HTTP协议。我们浏览器成输入的http://这就代表执行http协议。

Spring Boot 框架_第34张图片

- - 3.谷歌浏览器查看请求响应信息

Spring Boot 框架_第35张图片

- - 4.头信息

Spring Boot 框架_第36张图片

- - 5.响应头

Spring Boot 框架_第37张图片

- - 6.请求头

Spring Boot 框架_第38张图片

你可能感兴趣的:(spring,maven,spring,boot)