一.SpringBoot使用注意事项
1.1 pom.xml文件说明
1.parent标签的作用:
<!--
继承特点: 将父级内容进行引用.(简化)
SpringBoot理解: SpringBoot是框架的框架
问题: jar包冲突问题严重,之后需要有人统一管理
A.jar ~~~~ 5.1.jar
B.jar ~~~~ 4.8.jar
SpringBoot项目: 官网将大部分框架在内部进行了整合.
并且制定了,统一的版本依赖信息.
parent标签的作用: 定义当前SpringBoot所有依赖的版本号
-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/>
</parent>
2.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>
3.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>
关于Build标签说明
如果没有build标签则项目打包之后不能正常执行.报错如下
4.Maven指令
1.clean 删除编译后的目录target.java文件源码 .jar包(xxx.class文件)
用法: 1.当可能出现编译问题时 使用clean
2.项目打包前
2.install 项目发布 将xxx.class文件 打包成为xxx.jar
jar包位置:1.target目录下
2.本地仓库中
target目录下:
本地仓库目录下:
5.java项目发布命令
1.进入jar包的根目录
2.前提:必须配置JDK
说明: 通过 java -version 检查JDK是否配置正常.
如果提示java不是内部命令 则环境变量配置一定有问题.
环境变量配置:
3.项目发布
命令:java -jar xxx.jar
6.项目关闭问题
如果项目发布成功之后,需要关闭. 则直接关闭dos命令窗口即可.
如果依然不能正常关闭.则杀死进程/或者重启计算机.
杀进程 taskkill /pid 15524 /f
右键结束进程项即可
7.关于dos命令窗口锁定问题
说明: 当通过dos命令 启动tomcat服务器时,可能由于误操作.锁定当前dos窗口
解决方案: 万能取消指令 ctrl + c
二.SpringBoot高级用法
2.1@Value注解
1 需求说明
有时需要动态的获取数据,不能直接写死在代码中, 如何处理???
2.编辑YML文件
#语法说明
## 语法1: 数据结构 key-value结构
## 语法2: 写法 key:(空格)value
## 语法3: yml文件 默认字符集是UTF-8编码 中文不乱码
## 语法4: yml文件 有层级效果 注意缩进
server:
port: 8080
# SpringBoot启动时 默认加载yml文件
msg:
hello: "今天下雨,记得带伞"
3 编辑HelloController
@RestController //将该类交给Spring管理
public class HelloController {
/**
* 规则:
* 1. 当Spring容器启动时,会加载YML配置文件.
* 会将内部的key-value结构 加载到spring维护的内存空间中
* 2. @Value功能,从spring容器中根据key 动态赋值
* 3. springel表达式 简称:spel
*
* 使用场景:
* 如果代码中需要给成员变量赋值时,一般采用动态赋值的方式.
*/
@Value("${msg.hello}")
private String msg;
@RequestMapping("/hello")
public String hello(){
return msg;
}
}
4 .页面效果展现
2.2关于元注解的说明
1.@Target(ElementType.TYPE) 该注解对类有效
3.@Retention(RetentionPolicy.RUNTIME) 该注解在运行期有效
2.@Documented生成源码时,是否动态生成注释文档
4.@Inherited 标识注解是否可以被继承
2.3@ComponentScan说明
说明:当springboot启动时,会实例化很多的对象,但是需要排除特定的类型
原因:
SprinGBoot内部兼容了很多的第三方框架,但是其中个别加入之后会影响整个代码流程,所以通过这样的方式将个别的类排除在外.
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
2.4@SpringBootConfiguration注解说明
说明1:
关键词:配置文件/配置类 作用:整合第三方框架(配置)
@Configuration:该注解一般标识类文件,告知springBoot程序 这个类是用来整合第三方框架/配置的.
说明2:@SpringBootConfiguration修饰主启动类,说明主启动类也是一个配置类.
说明3: SpringBoot主启动类会扫描用户自己的配置类,并且实例化对象.
2.5@EnableAutoConfiguration注解说明
说明:自动化的配置如图所示
注解1:@AutoConfigurationPackage说明:
该注解表示自动配置的包扫描的路径
工作原理:该注解会动态的获取主启动类当前的包路径,之后开启包扫描的机制
知识点:以后代码都应该在主启动类的同包及子包中
注解2:@Import(AutoConfigurationImportSelector.class)
知识回顾:SpringBooT使用体现了“开箱即用”的思想,用户引入jar包之后,可以直接使用(少量配置)
思考:dependencies代表程序的依赖项(将其他的包加载到自己的项目中),只是加载不负责执行
流程说明(重点):
当SpringBoot的主启动执行时,内部会加载@Import(AutoConfigurationImportSelector.class),该注解的作用就是根据依赖信息,扫描加载进来的启动器,SpringBoot内部有n多个启动器,根据SpringBoot内部的配置信息,依次加载执行,当匹配了用户了启动器之后,程序负责实例化框架,如果匹配不到,跳过,继续向下执行,最终SpringBoot程序加载成功
2.6启动类注解结构图
2.7关于依赖考题
**问题1:**用户暂时不需要数据库的配置,问:能否先行添加数据源的启动项?
**答案:**不可以,因为启动项执行需要完整配置,数据源信息并未添加,导致报错
总结:
springboot项目中的依赖包尤其启动项,添加时慎重,如果需要添加启动器,则必须包装配置完整。否则程序启动必然失败!!!
三.SpringBoot高级用法
3.1 属性赋值
1@Value为属性赋值
YML配置信息
# SpringBoot启动时 默认加载yml文件
msg:
hello: "今天下雨,记得带伞~~"
动态赋值:
3.2properties文件为属性赋值
1.业务说明
业务有时会需要动态赋值,如果将大量的业务数据写到yml文件中,导致代码混乱。最好的方式应该指定 properties文件 为业务赋值.
2.编辑properties文件
#语法:
#数据结构: key=value
#注意事项: 不要添加""号 本身就是字符串.
#字符集编码: 写法采用utf-8,程序读取时采用ISO-8859-1
pro.msg=配置信息
2.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管理
//spring负责加载指定的配置文件
//如果注解中只有一个属性名称为value,则可以省略不写
@PropertySource(value = "classpath:/msg.properties",encoding = "utf-8")
public class Hello {
/**
* 加注解,规则:
* 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("hello")
public String HelloSpringBoot(){
return msg+"||"+proMsg;
}
}
3.3环境切换
要求: 不管是几个环境,要求配置项都必须相同,值可以不同
语法:
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: "我喜欢测试"
3.4热部署
1.添加依赖
<!--支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
2.3.2 配置IDEA环境
快捷键: ctrl + shift +alt + / 或者 ctrl + alt + a
3.5 Lombok插件安装
1 插件安装
2 添加jar包
<!--引入插件lombok 自动的set/get/构造方法插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
3.lombok作用
动态生成常见 get/set/toString等方法
//标准写法
//知识点: 为什么需要添加无参构造???
// 利用反射机制实例化对象时,默认调用无参构造
@Data //get/set/toString/equals/hashcode
@NoArgsConstructor //无参构造
@AllArgsConstructor//全参构造
@Accessors(chain = true)
public class User implements Serializable {
private Integer id;
private String name;
//链式加载的底层原理 返回User对象
/* public User setId(Integer id){
this.id = id;
return this; //代表当前对象!!!!!
}
public User setName(String name){
this.name = name;
return this;
}*/
}
4.lombok知识点
问题: lombok使用需要提前安装lombok插件!!, 如果项目发布在Linux系统中.问: 系统是否需要提前安装插件?
答案: 不要 因为lombok插件在编译期有效!!!
xxx.java文件编译为xxx.class文件.
知识衍生: 写的是java源码, 运行的是编译后的.class
3.6 SpringBoot测试类用法
1.业务说明
说明:有时由于业务需要,需要进行单元测试,单元测试中的对象可能会依赖spring容器
需求:需要Spring容器管理一个User对象,id=101 name =“好好学习”
分析:难点:定制化属性内容!!具体业务功能,利用配置类实现!!!
2.编辑配置类
//作用: 将自己需要的对象交给Spring容器管理
@Configuration //标识这是一个配置类
public class UserConfig {
/**
* 知识点:1.Spring内部维护一个Map集合
* 2. Map集合 key/value 分别是谁???
* 3.IOC管理的对象的方式 1.@Controller等注解 2.@bean
*
* 1.注解组合: @Configuration + @Bean
* 2.什么是bean: 被spring管理的对象就是bean
* 3.@Bean注解的作用
* 将方法的返回值对象交给Spring管理
* 4.Spring如何管理对象?
* 数据结构: Map集合 Map<K,V>
* key: 对象的ID
* value: 实例化之后的对象
* demo1: Spring如何管理对象
* key: 方法的名称
* value: 方法的返回值 Map<user,new User()>
*
* demo2:
* @Controller
* HelloController{}
* key: helloController 首字母小写
* value: spring通过反射创建的HelloController对象
* @return
*/
@Bean
public User user(){
return new User(101,"好好学习");
}
}
3.根据对象类型进行注入
4.编辑测试类
package com.jt.test;
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
public class TestSpring {
/**
* 注入方式:
* 1. 根据类型注入 (默认规则)
* 2. 根据名称注入 @Autowired
* @Qualifier("user")
*/
@Autowired
//@Qualifier(value="user")
private User user;
@Test
public void testUser(){
System.out.println(user.toString());
}
}
作业
新创建一个项目 demo2_mybatis 要求实现SpringBoot整合Mybatis
难点1. 引入jar包
难点2. 编辑YML配置文件 整合数据源 整合mybais
要求: 通过测试类 完成CURD操作 库和表使用之前项目的