SpringBoot原理篇

目录
配置优先级
Bean管理
SpringBoot原理

一、配置优先级
配置
SpringBoot 中支持三种格式的配置文件:

注意事项:
虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置 (yml是主流)。

SpringBoot 除了支持配置文件属性配置,还支持Java系统属性和命令行参数的方式进行属性配置。
Java系统属性:-Dserver.port=9000
命令行参数:--server.port=10010

①. 执行maven打包指令package

②. 执行java指令,运行jar包
java -Dserver.port=9000 -jar tlias-web-management-0.0.1-SNAPSHOT.jar --server.port=10010
注意事项:
Springboot项目进行打包时,需要引入插件 spring-boot-maven-plugin (基于官网骨架创建项目,会自动添加该插件)

优先级(高到底)
命令行参数(--xxx=xxx)
java系统属性(-Dxxx=xxx)
application.properties
application.yml
application.yaml(忽略)

二、Bean管理
1.获取bean
默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:
根据name获取bean:
Object getBean(String name)
根据类型获取bean:
<T> T getBean(Class<T> requiredType)
根据name的名称及类型获取bean:
<T> T getBean(String name, Class<T> requiredType)
注意事项:
上述所说的 【Spring项目启动时,会把其中的bean都创建好】还会受到作用域及延迟初始化影响,这里主要针对于 默认的单例非延迟加载的bean而言。

2.bean作用域
Spring支持五种作用域,后三种在web环境才生效:

可以通过 @Scope 注解来进行配置作用域:
注意事项:
默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。

3.第三方bean
@Bean
如果要管理的bean对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明bean的,就需要用到 @Bean注解。
若要管理的第三方bean对象,建议对这些bean进行集中分类配置,可以通过@Configuration注解声明一个配置类。

新建一个config包,创建一个配置类(推荐)
测试:
注意事项:
通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
思考:
@Component 及衍生注解 与 @Bean注解使用场景?
项目中自定义的,使用@Component及其衍生注解
项目中引入第三方的,使用@Bean注解

SpringBoot原理



1.起步依赖原理
spring框架进行web程序开发,我们要引入各种依赖,还要兼顾版本号(繁琐)

springboot框架进行web程序开发


2.自动配置
SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
自动配置原理(面试高频):
方案一:@ComponentScan 组件扫描

方案二:@Import 导入。使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:
导入 普通类,交给IOC容器管理
导入 配置类,交给IOC容器管理
导入 ImportSelector 接口实现类
@EnableXxxx注解,封装@Import注解(优雅、方便)


源码跟踪

@SpringBootApplication是源码的入口,这个注解底层封装了三个注解

该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解。该注解由三个部分组成:
@SpringBootConfiguration:该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类。
@ComponentScan:组件扫描,默认扫描当前引导类所在包及其子包。
@EnableAutoConfiguration:SpringBoot实现自动化配置的核心注解。

在@EnableAutoConfiguration中又封装了@Import注解

这个@Import注解当中指定的是一个AutoConfigurationImportSelector这个接口的实现类,这个接口实现了selectImports这个方法

在这个方法AutoConfigurationImportSelector当中加载了两个文件。我们现在使用的版本是2.7.x版本,它还兼容spring.factories文件,到了springboot3.x.x当中,spring.factories文件就会彻底移除掉。

org.springframework.boot.autoconfigure.AutoConfiguration.imports:

org.springframework.boot.autoconfigure.AutoConfiguration.imports这份文件当中,定义的就是配置类的全类名,在这个配置类当中,我们就可以通过@bean注解声明一个一个的bean对象,最终SpringBoot项目在启动的时候,它就会加载这个配置文件当中所配置的配置类,然后将这些配置类当中的信息封装到string类型的数组当中,最终通过@Import这个注解将这些配置类全部加载到Spring的IOC容器当中,交给IOC容器管理。
全部注册为IOC容器的bean ?
SpringBoot会根据@Conditional注解条件装配

@Conditional
作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中。
位置:方法、类
@Conditional 本身是一个父注解,派生出大量的子注解:
@ConditionalOnClass:判断环境中是否有对应字节码文件,才注册bean到IOC容器。
@ConditionalOnMissingBean:判断环境中没有对应的bean(类型 或 名称) ,才注册bean到IOC容器。
@ConditionalOnProperty:判断配置文件中有对应属性和值,才注册bean到IOC容器。

案例(自定义starter)
在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot 的 starter。


需求:自定义aliyun-oss-spring-boot-starter,完成阿里云OSS操作工具类 AliyunOSSUtils 的自动配置。
目标:引入起步依赖引入之后,要想使用阿里云OSS,注入 AliyunOSSUtils直接使用即可。
步骤:
创建 aliyun-oss-spring-boot-starter 模块
创建aliyun-oss-spring-boot-autoconfigure模块,在starter中引入该模块
在aliyun-oss-spring-boot-autoconfigure模块中的定义自动配置功能,并定义自动配置文件 META-INF/spring/xxxx.imports
