SpringBoot高级-底层原理
目录
1 SpringBoot自动化配置原理
01-SpringBoot2高级-starter依赖管理机制
02-SpringBoot2高级-自动化配置初体验
03-SpringBoot2高级-底层原理-@Configuration配置注解
04-SpringBoot2高级-底层原理-@Import注解使用1
05-SpringBoot2高级-底层原理-@Import注解使用2
06-SpringBoot2高级-底层原理-@Conditional衍生条件装配
07-SpringBoot2高级-底层原理-@ConfigurationProperties配置绑定
08-SpringBoot2高级-自动化配置原理-@SpringBootApplication入口分析
09-SpringBoot2高级-自动化配置原理-@EnableAutoConfiguration自动配置注解
10-SpringBoot2高级-自动化配置原理-按条件开启自动配置类和配置项
11-SpringBoot2高级-自动化配置原理-debug全流程
12-SpringBoot2高级-自动化配置原理-总结
2 SpringBoot健康监控
13-SpringBoot2高级-监控-健康监控服务
14-SpringBoot2高级-监控-Admin可视化
- 理解SpringBoot自动化配置源码
- 理解SpringBoot健康监控
1 SpringBoot自动化配置原理
01-SpringBoot2高级-starter依赖管理机制
目的:通过依赖能了解SpringBoot管理了哪些starter
讲解:
- 通过依赖 spring-boot-dependencies 搜索 starter- 发现非常多的官方starter,并且已经帮助我们管理好了版本。
- 项目中使用直接引入对应的 starter 即可,这个场景下需要的依赖就会自动导入到项目中,简化了繁琐的依赖。如果需要修改版本可以有两种方式:
- 重写maven属性
- 使用Maven依赖管理的就近原则
3.引入 starter 不仅仅是帮助我们管理了依赖,还帮我做了很多的默认的配置信息,简化了大量的配置,使用更加的简单。
4.所有的场景启动器的底层都依赖 spring-boot-starter
org.springframework.boot spring-boot-starter 2.3.10.RELEASE compile
小结:
- 引入官方starter依赖默认都可以不写版本
- 如果配置满足您当前开发需要,则默认配置即可
02-SpringBoot2高级-自动化配置初体验
目的:以web MVC自动化配置原理为例讲解,能够理解web MVC自动化配置加入了哪些依赖,做了哪些默认配置。
讲解:
回忆一下:SpringMVC博文中,我们在 SSM整合时;
添加spring及spring web mvc相关依赖
springmvc配置类:
1、扫描controller层
2、静态资源控制
3、......
servlet容器配置类:
1、扫描springmvc配置类
2、扫描spring配置类
3、设置哪些请求交给springmvc处理
4、POST请求乱码过滤器
部署还需要单独的tomcat
也就是说:我们现在需要在开发业务代码前,就必须要准备好这些环境,否则无法完成业务代码,这就是我们现在的问题。
让这些问题成为过去,现在我们就探索一下SpringBoot是如何帮助我们完成强大而又简单自动化配置的。
引入 web 开发场景启动器依赖:
org.springframework.boot spring-boot-starter-web
帮助我们做了以下自动化配置:
- 依赖版本和依赖什么jar都不需要开发者关注
- 自动化配置
- 自动配好SpringMVC
- 引入SpringMVC全套组件
- 自动配好SpringMVC常用组件(三大组件,文件上传等)
- 自动配好Web常见功能,如:字符编码问题,静态资源管理
- 自动配好Tomcat
小结:
- 有了SpringBoot以后,让开发人员重点关注业务本身,而不是环境上,提升了开发效率。
03-SpringBoot2高级-底层原理-@Configuration配置注解
目的:掌握@Configuration注解的作用及新特性
讲解:
1、@Configuration注解的作用是替代原始 spring配置文件 功能
演示:
1)编写配置类
package com.itheima.sh.config; import com.itheima.sh.pojo.User; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * 1、@Configuration 替代 spring配置文件(配置bean) * 2、组件源码中包含 @Component 注解,当前类也会注册到 IOC 容器,默认类名小写 * 3、默认都是单例的 */ @Configuration public class MyConfig { @Bean // 默认方法名称作为容器中的name public User getUser() { return new User(); } }
2)在引导类编写代码测试:
@SpringBootApplication @MapperScan(basePackages = "com.itheima.sh.mapper") public class DataApplication { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(DataApplication.class, args); // 根据name获取容器中的bean User user1 = applicationContext.getBean("getUser", User.class); User user2 = applicationContext.getBean("getUser", User.class); System.out.println(user1 == user2); MyConfig myConfig1 = applicationContext.getBean("myConfig", MyConfig.class); MyConfig myConfig2 = applicationContext.getBean("myConfig", MyConfig.class); System.out.println(myConfig1 == myConfig2); // 注意:如果 MYConfig配置类没有按照规范编写,则容器中bean 的name为 类名 } }
SpringBoot 提供一个注解和当前注解功能一样:
@SpringBootConfiguration
2、proxyBeanMethods:代理bean的方法属性(since spring 5.2以后)
功能:
- proxyBeanMethods = true:Full模式,保证每个@Bean方法被调用多少次返回的组件都是单实例的
- proxyBeanMethods = false:Lite模式,每个@Bean方法被调用多少次返回的组件都是新创建的
演示:
- 默认 proxyBeanMethods=true,springBoot会检查这个组件是否在容器中有,有则直接引用
// 默认 proxyBeanMethods=true springBoot会检查这个组件是否在容器中有,有则直接引用 User user3 = myConfig1.getUser(); System.out.println(user1 == user3); // true
- 修改 proxyBeanMethods=false,则每调用一次Spring就会创建一个新的Bean对象
在执行结果则为 false, 证明两次获取的bean不是同一个bean。