欢迎光临散文网 会员登陆 & 注册

SpringBoot原理篇

2023-04-16 16:39 作者:苏喆i  | 我要投稿

目录

配置优先级

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原理

Spring
SpringBoot


1.起步依赖原理

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

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

SpringBoot原理篇的评论 (共 条)

分享到微博请遵守国家法律