SpringBoot基础
一、Springboot的特点
- 父项目依赖
-
在每个springboot项目中,均有一个父项目依赖,点开之后会看到一个spring-boot-dependencies,点开以后会看见里面几乎声明了所有开发中常用的依赖的版本号,即自动版本仲裁。
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.5.RELEASE</version> <relativePath>../../spring-boot-dependencies</relativePath> </parent>
- 这里才是真正管理SpringBoot应用里面所有依赖版本的地方,SpringBoot的版本控制中心;
-
stater
-
在日常开发中会见到很多的starter,spring-boot-starter-* , *就是某种场景
-
只要引入starter,这个场景所有常规需要的依赖都会自动注入
-
springboot所有支持的场景https://docs.spring.io/spring-boot/docs/2.3.10.RELEASE/reference/html/using-spring-boot.html#using-boot-starter 在官方文档中均可选择
-
见到的 *-spring-boot-stater:第三方为我们提供的简化开发的场景启动器
-
所有场景启动器最底层的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-json</artifactId> <version>2.4.4</version> <scope>compile</scope> </dependency>
-
-
我们导入依赖默认是不需要写版本;但是如果导入的包没有在依赖中管理着就需要手动配置版本了;
二、自动配置
-
自动配好Tomcat
- 引入tomcat依赖
- 自动配置tomcat
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> <version>2.4.4</version> <scope>compile</scope> </dependency>
-
自动配好SpringMVC
- 引入SpringMVC的全套组件
- 自动配好SpringMVC常用组件(功能)
-
自动配好Web常见功能,如:字符编码问题
- SpringBoot帮我们配置好了所有web开发的常见场景
-
默认的包结构
-
主程序所在的包及其下面所有的子包里面的组件都会被默认扫描出来
-
无需以前的包扫描配置
-
想要改变扫描路径,可以
@SpringBootApplication
(scanBasePackages=“你的包路径”),或者使用@ComponentScan
指定扫描路径@SpringBootApplication 等同于 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan
-
-
各种配置拥有的默认值
- 默认配置最终都是映射到MultipartProperties
- 配置文件的值最终会绑定到每个类上,这个类会在容器中创建对象
-
按需加载所有自动配置项
-
非常多的starter
-
引入了哪些场景,这个场景的自动配置才会开启
-
Springboot所有的自动配置功能都在spring-boot-autoconfigure包里面
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>2.4.4</version> <scope>compile</scope> </dependency>
-
三、容器功能
-
组件添加
-
@Configuration
-
基本使用
//1.配置类里面使用@Bean标注在方法上给容器注册组件,默认是单实例的 //2.配置类本身也组件 //3. @Configuration//告诉SpringBoot这是一个配置类 == 配置文件(.xml) //自定义国际化组件生效 @Bean //给容器中添加组件,以方法名作为组件的id,返回类型就是组件类型,返回的值,就是组件在容器中的实例 //外部无论对配置类中的这个组件注册方法调用多少次,获取的都是之前注册进容器的单实例对象 public LocaleResolver localeResolver(){ return new MyLocaleResolver(); } }
-
Full模式与Lite模式
-
通过控制proxyBeanMethod = true or false
-
配置类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断
-
配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式
-
-
-
四、@EnableAutoConfigration
-
@EnableAutoConfifiguration :开启自动配置功能
- 以前我们需要自己配置的东西,而现在SpringBoot可以自动帮我们配置 ; @EnableAutoConfifiguration告诉SpringBoot开启自动配置功能,这样自动配置才能生效;
-
@AutoConfifigurationPackage : 自动配置包
@Import({Registrar.class}) public @interface AutoConfigurationPackage { }
-
@import
- Spring底层注解@import , 给容器中导入一个组件
- Registrar.class 作用:将主启动类的所在包及包下面所有子包里面的所有组件扫描到Spring容器
-
@Import({AutoConfifigurationImportSelector.class}) :给容器导入组件 ;
-
AutoConfifigurationImportSelector : 自动配置导入选择器
//获得候选的配置 protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) { //这里的getSpringFactoriesLoaderFactoryClass()方法 //返回的就是我们最开始看的 启动自动导入配置文件的注解类;EnableAutoConfiguration List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),getBeanClassLoader()); Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct."); return configurations; }
-
-
结论
- SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfifiguration指定的值
- 将这些值作为自动配置类导入容器,自动配置类就生效,帮我们进行自动配置工作
- 整个J2EE的整体解决方案和自动配置都在springboot-autoconfigigure的jar包中
- 他会给容器中导入非常多的配置类(xxxAutoConfigration),就是给容器中导入这个场景需要的所有组件,并配置好这些组件
- 有了自动配置类,免去了我们手动编写配置注入功能组件等的工作
五、run方法
- springboot是通过main方法下的SpringApplication.run方法启动的,启动的时候他会调用refreshContext方法,先刷新容器
- 然后根据解析注解或者解析配置文件的形式注册bean,而它是通过启动类的SpringBootApplication注解进行开始解析的
- 他会根据EnableAutoConfiguration开启自动化配置,里面有个核心方法ImportSelect选择性的导入,根据loadFanctoryNames根据classpash路径以MATA-INF/spring.factorces下面xxxxEnableAutoConfiguration开头的key去加载里面所有对应的自动化配置
- 他并不是把所有的自动化配置全部导入,在他每个自动化配置里面都有条件判断注解,先判断是否引入相互的jar包,再判断容器是否有bean再进行注入到bean容器