文章目录
- 一、Spring Boot
- - 1.定义
- - 2.特点
- - 3.项目创建
- - 4.项目版本
- - 5.关于项目报错说明
- - 6.SpringBoot全新的pom.xml
- - 7.SpringBoot的高级
- - 8.IDEA第一个SpringBoot Project
- - 9.SpringBoot高级用法
- - 10.项目发布
- - 11.SpringBoot 注意事项
- - 12.环境切换
- - 13.SpringBoot测试类用法(Spring中IOC和DI的底层原理)
- - 14.拓展
- - 15.常见问题:8080端口冲突
- - 16.扩展:请求响应的过程
一、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.测试
- 开启服务器(运行main方法)
- 打开浏览器访问: 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.项目发布
- 进入jar包根目录
- 前提:必须得正确配置JDK
说明: 通过 java -version 检查JDK是否配置正常.
如果提示java不是内部命令 则环境变量配置一定有问题.
环境变量配置:
-
项目发布
命令:java -jar xxx.jar
-
项目关闭问题
如果项目发布成功之后,需要关闭。则直接关闭dos命令窗口即可。
如果依然不能正常关闭,则杀死进程/或者重启计算机。
右键结束进程项即可
- 关于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方法注入:
- 根据对象类型进行注入(默认规则)
@Autowired - 根据对象名称进行注入 - - 下面两个注解必须一起使用
@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协议。