springboot的高级用法与主启动类说明
@Value注解(属性赋值)
-
需求说明:有需要动态的获取数据,不能直接写死在代码中
-
使用场景:如果代码中需要给成员变量赋值时,一般采用动态赋值的方式
-
案例:
-
在yml中配置信息
-
# SpringBoot启动时 默认加载yml文件 msg: hello: "今天下雨,记得带伞~~"
-
-
-
在properties文件中为属性赋值
-
业务说明:业务有时需要动态赋值,如果大量的业务数据写到yml文件中,数据太过混乱,最好的方式应该指定properties文案金为业务复制
-
编辑properties文件
-
#语法: #数据结构: key=value #注意事项: 不要添加""号 本身就是字符串. #字符集编码: 写法采用utf-8,程序读取时采用ISO-8859-1 pro.msg=配置信息
-
-
控制层代码
-
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 则可以省略不写,将程序读取时的编码格式设置为utf8,防止中文乱码 @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; } }
-
-
-
环境切换
-
在开发的时候可能分为几个环境:开发环境、测试环境、生产环境等
-
要求:不管是几个环境,要求配置下你给都必须相同,值可以不同
-
语法:
- 使用-实现yml配置文件的分割
- 定义环境的名称
- 定义默认的环境名称
-
案例:yml文件:
-
#指定默认的环境 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: "我喜欢测试"
-
lombok插件的使用
-
添加jar包
-
<!--引入插件lombok 自动的set/get/构造方法插件 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
-
-
常用注解
-
//标准写法 //知识点: 为什么需要添加无参构造??? // 利用反射机制实例化对象时,默认调用无参构造 @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; }*/ }
-
热部署
-
添加依赖:
-
<!--支持热部署 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
-
-
配置idea环境
-
快捷键:ctrl+shift+alt+/ 或者 ctrl + shift + a
-
-
勾选属性即可实现热部署
-
-
springboot测试类用法
-
业务说明:
- 说明:有时由于业务需要,需要进行单元测试, 单元测试中的对象可能会依赖Spring容器.
需求: 需要Spring容器管理一个User对象. id=101 name=“好好学习”
分析: 难点: 定制化属性内容!!! 具体业务功能. 利用配置类实现!!!
- 说明:有时由于业务需要,需要进行单元测试, 单元测试中的对象可能会依赖Spring容器.
-
编辑配置类
-
//作用: 将自己需要的对象交给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,"好好学习"); } }
-
-
编辑测试类
-
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. 根据类型注入 (默认规则)@Autowired * 2. 根据名称注入 @Qualifier("user") */ @Autowired //@Qualifier(value="user") private User user; @Test public void testUser(){ System.out.println(user.toString()); } }
-
-
spring对象注入原理(依赖注入):
-
sprinigboot的主启动类说明
-
主启动类注解结构图
-
-
关于元注解的说明:
- @Target(ElementType.TYPE) 该注解对类有效
@Retention(RetentionPolicy.RUNTIME) 该注解在运行期有效
@Documented 生成源码时 是否动态生成注释文档
@Inherited 标识注解是否可以被继承
- @Target(ElementType.TYPE) 该注解对类有效
-
@ComponentScan说明
-
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
-
说明:当springboot启动时,会扫描用户自己的配置类,并且实例化对象,但是会排除特定的类型,避免影响整个代码的流程
-
-
@SpringBootConfiguration注解说明
- @Configuration:该注解一般标识类文件,告知springboot程序,这个类是一个用来整合第三方框架/配置的
- 从上图可以看出主启动类也是一个配置类
-
@EnableAutoConfiguration注解说明
-
-
@AutoConfigurationPackage说明
该注解表示自动配置的包扫描的路径.
工作原理: 该注解会动态的获取主启动类当前的包路径.之后开启包扫描的机制.
知识点: 以后写代码都应该在主启动类的同包及子包中. -
@Import(AutoConfigurationImportSelector.class)
知识回顾: SpringBoot使用体现了"开箱即用"的思想,用户引入jar包之后 可以直接使用(少量配置).
思考: dependencies代表程序的依赖项,(将其他的包加载到自己的项目中), 只是加载不负责执行. -
流程说明(重点!!!)
当SpringBoot主启动项执行时,内部会加载@Import(AutoConfigurationImportSelector.class),
该注解的作用就是根据依赖信息,根据SpringBoot内部的配置信息,依次加载执行.
当匹配了用户添加的启动器之后,程序负责实例化框架(执行jar包中的内容).
如果匹配不到,则继续向下执行.最终SpringBoot程序加载成功. -
-