1.SpringBoot使用注意事项
1.1关于Build标签说明
如果没有build标签则项目打包之后不能正常运行,报错
1.2关于主启动类说明
1.2.1 关于元注解的说明
@Target(ElementType.TYPE) 该注解对类有效
@Retention(RetentionPolicy.RUNTIME) 该注解在运行期有效
@Document 生成源码时 是否动态生成注释文档
@Inherited 标识注解是否可以被继承
1.2.2@ComponentScan说明
说明:当springBoot启动时,会实例化很多的对象,但是需要排除特定的类型
原因:SpringBoot内部兼容了很多的第三方框架,但是其中个别加入之后会影响整个代码流程
所以通过这样的方式将个别的类排除在外
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
1.2.3 @SpringBootConfiguration注解说明
关键词:配置文件/配置类 作用:整合第三方框架(配置)
@Configuration:该注解一般标识类文件,告知springBoot程序 这个类用来整合第三方框架/配置的
@SpringBootConfiguration修饰主启动类,说明主启动类也是一个配置类
SpringBoot主启动类会扫描用户自己的配置类,并且实例化对象
1.2.4 @EnableAutoConfiguration注解说明
说明:自动化的配置如图所示:
@AutoConfigurationPackage说明:
该注解表示自动配置的包扫描的路径
工作原理:该注解会动态的获取主启动类当前的包路径.之后开启包扫描的机制
知识点:以后写代码都应该在主启动类的同包及子包中
@Import(AutoConfigurationImportSelector.class)
SpringBoot使用体现了"开箱即用"的思想,用户引入jar包之后 可以直接使用(少量配置)
思考:dependencies代表程序的依赖项,(将其它的包加载到自己的项目中),只是加载不负责执行
流程说明(重点!!!)
当SpringBoot主启动项执行时,内部会加载@Import(AutoConfigurationImportSelector.class)
该注解的作用就是根据依赖信息,根据SpringBoot内部的配置信息,依次加载执行
当匹配了用户添加的启动器之后,程序负责实例化框架(执行jar包中的内容)
如果匹配不到,则继续向下执行,最终SpringBoot程序加载成功
1.2.5 主启动类注解结构图
1.2.6 关于依赖考题
问题:用户暂时不需要数据库的配置,问:能否先行添加数据源的启动项?(不添加任何注解!!)
答案:不可以,因为启动项执行需要完整配置,数据源信息并未添加,导致报错
总结:SpringBoot项目中的依赖包尤其启动项,添加时慎重,如果需要添加启动器,则必须保证配置完整.否则程序启动必然失败
2.SpringBoot高级用法
2.1属性赋值
2.1.1 @Value为属性赋值
YML配置信息
# SpringBoot启动时 默认加载yml文件
msg:
hello: "今天下雨,记得带伞~~"
动态赋值:
2.2properties文件为属性赋值
2.2.1 业务说明
业务有时会需要动态赋值,如果将大量的业务数据写到yml文件中 导致代码混乱.最好的方式应该指定properties文件为业务赋值
2.2.2 编辑properties文件
#语法:
#数据结构: key=value
#注意事项: 不要添加""号 本身就是字符串.
#字符集编码: 写法采用utf-8,程序读取时采用ISO-8859-1
pro.msg=配置信息
2.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 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("/hello")
public String hello(){
return msg+"||"+proMsg;
}
}
2.2 环境切换
要求:不管是几个环境,要求配置项都必须相同,值可以不同
语法:
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: "我喜欢测试"
2.3热部署
2.3.1添加依赖
<!--支持热部署 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
2.3.2配置IDEA环境
快捷键:ctrl + shift + alt + / 或者ctrl + alt + a
2.4 Lombok插件安装
2.4.1插件安装
2.4.2 添加jar包
<!--引入插件lombok 自动的set/get/构造方法插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
2.4.3 lombok作用
//标准写法
//知识点: 为什么需要添加无参构造???
// 利用反射机制实例化对象时,默认调用无参构造
@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;
}*/
}
2.4.4 lombok知识点
问题:lombok使用需要提前安装lombok插件!!如果项目发布在Linux系统中.问:系统是否需要提前安装插件?
答案:不要 因为lombok插件在编译器有效
2.5 SpringBoot测试类用法
2.5.1 业务说明
说明:有时由于业务需要,需要进行单元测试,单元测试中的对象可能会依赖Spring容器
需求:需要Spring容器管理一个User对象. id=101 name="好好学习"
分析:难点:定制化属性内容!!! 具体业务功能.利用配置类实现
2.5.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,"好好学习");
}
}
2.5.3 Spring对象注入原理
根据对象类型进行注入
2.5.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());
}
}