Spring Boot 框架

文章目录

一、Spring Boot

- 1.定义

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

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

- 2.特点

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

- 3.项目创建

在这里插入图片描述

- 4.项目版本

在这里插入图片描述

- 5.关于项目报错说明

如果项目中出现parent标签报错/插件报错说明:
在这里插入图片描述
1.parent标签报错:
在这里插入图片描述
2.maven插件报错
在这里插入图片描述

- 6.SpringBoot全新的pom.xml

pom.xml

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

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

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

<?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>
	<groupId>cn.tedu</groupId>
	<artifactId>jk</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>jk</name>
	<description>Demo project for Spring Boot</description>

  	<!-- 提供相关的 Maven 默认依赖 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.2</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	
	<properties>
		<!-- 指定jdk版本 -->
		<java.version>1.8</java.version>
		<!-- 跳过测试类打包 -->
		<skipTests>true</skipTests>
	</properties>
	
	<!-- 添加依赖 -->
	<dependencies>
		<!-- 使用springmvc构建程序并使用默认的嵌入式容器Tomcat -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
		<!-- 使用Junit测试springboot程序 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
		
	</dependencies>
	<build>
		<!-- 添加插件 -->
		<plugins>
			<!-- springboot添加maven插件,会打包成一个可以直接运行的 JAR 文件,直接部署到服务器 -->
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

- 7.SpringBoot的高级

- - 1.pom.xml文件说明
	<!--
		项坐目标:组ID/项目名/版本号
		作用:
			1.可以在本地仓库中定位项目
			2.可以作为依赖项被其他项目引用
	-->
	<groupId>com.jt</groupId>
	<artifactId>springboot_demo01</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>springboot_demo01</name>
	<description>Demo project for Spring Boot</description>

parent标签的作用

	<!--
	 	继承特点:将父级的内容进行引用(简化)
	 	SpringBoot理解:SpringBoot是框架的框架
	 	问题:jar包冲突问题:
	 		  	A.jar ~~~~ 5.1.jar
			  	B.jar ~~~~ 4.8.jar
			  SpringBoot解决了jar包冲突问题
		SpringBoot项目:官网将大部分框架在内部进行了整合,并且制定了统一的版本依赖信息。
		parent标签的作用:定义当前的SpringBoot所有依赖的版本号
	-->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.3</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

dependency标签作用

	<!--
		按需导入
		历史说明:2010 原来SSM 需要手动的编辑大量的配置文件
		思想:SpringBoot的使用体现了"开箱即用"的思想
	-->
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<!-- SpringBoot的启动器 在内部已经将整合的配置写好了,实现拿来就用 -->
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

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

build标签作用

	<!-- 
		Build标签
	 	SpringBoot项目 在打包部署发布时,需要依赖maven工具API
	 	如果不添加该插件,则直接影响项目发布
	 -->
	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<version>2.5.3</version>
			</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
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述

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 (本机 端口号 要访问的资源)

在这里插入图片描述

- 9.SpringBoot高级用法

@Value为属性赋值

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

有时需要动态的获取数据,不能直接写死在代码中, 如何处理?
在这里插入图片描述

- - - 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.页面效果展现

在这里插入图片描述

- - 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.页面展示效果

在这里插入图片描述

- 10.项目发布

  1. 进入jar包根目录

在这里插入图片描述

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

说明: 通过 java -version 检查JDK是否配置正常.
如果提示java不是内部命令 则环境变量配置一定有问题.
在这里插入图片描述
环境变量配置:
在这里插入图片描述

  1. 项目发布

    命令:java -jar xxx.jar

    在这里插入图片描述

  2. 项目关闭问题

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

在这里插入图片描述
右键结束进程项即可
在这里插入图片描述

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

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

- 11.SpringBoot 注意事项

- - 1.关于Build标签说明

如果没有build标签则项目打包之后不能正常执行。报错如下
在这里插入图片描述

- - 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程序 这个类是用来整合第三方框架/配置的。
在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

4.@EnableAutoConfiguration注解说明

说明: 自动化的配置如图所示:
在这里插入图片描述

- 4.1 @AutoConfigurationPackage说明

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

- 4.2 @Import(AutoConfigurationImportSelector.class)

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

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

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

5.主启动类注解结构图

在这里插入图片描述

6. 关于依赖考题

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

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

- 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<user2(),new User()>
     *      3.IOC管理对象的2种方式
     *                      -- 1.层级代码用@Controller等注解
     *                      -- 2.业务需求用 @Configuration + @Bean
     *
     * 1.注解组合:@Configuration + @Bean
     * 2.什么是bean? -- 被Spring管理的对象
     * 3.@Bean注解的作用
     *      将方法的返回值对象交给Spring管理
     * 4.Spring如何管理对象???
     *      数据结构:Map集合     Map<K,V>
     *       key:对象的ID
     *       value:实例化之后的对象
     * demo1:Spring如何管理对象
     *         key是方法名
     *         value是方法的返回值
     *         Map<user2(),new User()>
     * 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

在这里插入图片描述

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:

在这里插入图片描述
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已经被占用。关闭服务,重新启动即可。
在这里插入图片描述
仍未解决的话,以下三种方式任选一个来测试.

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
在这里插入图片描述

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

- - 1.HTTP协议

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

- - 2.执行过程

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

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

在这里插入图片描述

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

在这里插入图片描述

- - 4.头信息

在这里插入图片描述

- - 5.响应头

在这里插入图片描述

- - 6.请求头

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

꯭ 瞎꯭扯꯭蛋꯭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值