SpringBoot原理
配置优先级
配置文件
-
SpringBoot 中支持三种格式的配置文件:application.properties,application.yml,application.yaml。
-
其优先级为:application.properties > application.yml > application.yaml。
注意事项
- 虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置 (yml是主流)。
其他配置方式
- SpringBoot 除了支持配置文件属性配置,还支持Java系统属性和命令行参数方式进行属性配置端口号:
- Java系统属性:
-Dserver.port=端口号
;命令行参数:--server.port=端口号
。 - 优先级为:命令行参数 > Java系统属性。
在IDEA中配置
在命令行中配置
- 执行maven打包指令package生成jar包。
- 执行java指令,运行jar包,同时进行端口配置:
java -Dserver.port=端口号 -jar jar包名称.jar --server.port=端口号
注意事项
- Springboot项目进行打包时,需要引入插件 spring-boot-maven-plugin (基于官网骨架创建项目时,会自动添加该插件)。
优先级总结
- 命令行参数 > Java系统属性 > application.properties > application.yml > application.yaml。
Bean管理
获取Bean
-
默认情况下,Spring项目启动时,会把bean都创建好放在IOC容器中,如果想要主动获取这些bean,可以通过如下方式:
- 首先获取IOC容器对象:
@Autowired private ApplicationContext applicationContect; //IOC容器对象
- 根据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而言。
bean作用域
- Spring支持五种作用域,后三种在web环境才生效:
作用域 | 说明 |
---|---|
singleton | 容器内同 名称 的 bean 只有一个实例(单例)(默认) |
prototype | 每次使用该 bean 时会创建新的实例(非单例) |
request | 每个请求范围内会创建新的实例(web环境中,了解) |
session | 每个会话范围内会创建新的实例(web环境中,了解) |
application | 每个应用范围内会创建新的实例(web环境中,了解) |
- 可以通过在Bean类上方使用 @Scope 注解来进行配置作用域:
@Scpoe("作用域名称")
几点注意
- 默认singleton的bean,在容器启动时被创建,可以使用@Lazy注解来延迟初始化(延迟到第一次使用时)。
- prototype的bean,每一次使用该bean的时候都会创建一个新的实例。
- 实际开发当中,绝大部分的Bean是单例的,也就是说绝大部分Bean不需要配置scope属性。
第三方bean
- 如果要管理的bean对象来自于第三方(不是自定义的),是无法用 @Component 及衍生注解声明bean的,就需要用到 @Bean注解。
- 若要管理的第三方bean对象,建议对这些bean进行集中分类配置,可以通过 @Configuration 注解声明一个配置类。
@Configuration
public class CommonConfig {
@Bean //将当前方法的返回值交给IOC容器管理,称为IOC容器Bean
public SAXReader saxReader(){
return new SAXReader();
}
}
几点注意
- 通过@Bean注解的name或value属性可以声明bean的名称,如果不指定,默认bean的名称就是方法名。
- 如果第三方bean需要依赖其它bean对象,直接在bean定义方法中设置形参即可,容器会根据类型自动装配。
@Component及衍生注解与@Bean注解的选择
- 项目中自定义的,使用@Component及其衍生注解。
- 项目中引入第三方的,使用@Bean注解。
SpringBoot原理
- Spring框架是世界上最流行的Java框架,它提供了很多优秀的子框架,而所有Spring家族中的框架都是基于Spring Framework这一基础框架的。
- 但是Spring Framework使用起来非常繁琐,体现在依赖和配置上。
- Spring Boot框架是用来简化Spring框架的开发的,它开发起来更加简单、快捷,也是Spring家族中最流行的一个子框架。
- Spring Boot框架提供了两个非常重要的功能:起步依赖和自动配置,这些功能使它使用起来非常简单、快捷。
起步依赖
- Spring Boot的起步依赖的功能是利用Maven的依赖传递特性实现的:它在起步依赖中提供了当前程序开发所需要的所有的常见依赖,并且做了版本的适配。
自动配置
- SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作。
自动配置原理
导入第三方包的方法
方案一
- @ComponentScan组件扫描:在引导类上加上@ComponentScan注解,其属性值为要导入的包名字符串数组。
- 缺点:使用繁琐,性能低。
方案二
-
@Import导入:使用@Import导入的类会被Spring加载到IOC容器中,导入形式主要有以下几种:
- 导入普通类。
- 导入配置类。
- 导入ImportSelector接口实现类。
- 使用@EnableXxxx注解,封装@Import注解。
-
其中第四种形式使用起来最为方便,也是Spring Boot采用的方式。
自动配置原理
- @SpringBootApplication注解该注解标识在SpringBoot工程引导类上,是SpringBoot中最最最重要的注解。该注解由三个部分组成:
组成部分 | 说明 |
---|---|
@SpringBootConfiguration | 该注解与 @Configuration 注解作用相同,用来声明当前也是一个配置类 |
@ComponentScan | 组件扫描,默认扫描当前引导类所在包及其子包 |
@EnableAutoConfiguration | SpringBoot实现自动化配置的核心注解 |
- 在EnableAutoConfiguration注解上添加了@Import注解,其属性值为AutoConfigurationImportSelector.class。
- 在AutoConfigurationImportSelector类中定义了几个方法,其作用为从被引入的依赖的包的META-INF/spring/org.springframework.boot.AutoConfiguration.imports和META-INF/spring/spring.factories这两个文件中引入配置信息。
- 这两个文件中保存的即是要配置的自动配置类的全类名。
- 最后SpringBoot会根据这些文件并按照@Conditional注解条件装配Bean。
注意事项
- spring.factories文件是Spring Boot早期版本中使用的,SpringBoot2.7.x引入了org.springframework.boot.AutoConfiguration.imports文件并兼容spring.factories文件,Spring3.x版本中已经移除spring.factories文件。
@Conditional
-
作用:按照一定的条件进行判断,在满足给定条件后才会注册对应的bean对象到Spring IOC容器中。
-
位置:方法、类。
-
@Conditional 本身是一个父注解,派生出了大量的子注解:
- @ConditionalOnClass:判断环境中是否有对应字节码文件,有才注册bean到IOC容器。属性为name,其值为要判断的类的全类名。
@Bean @ConditionalOnClass(name = "io.jsonwebtoken.Jwts") //当前环境存在指定的这个类时,才声明该bean public HeaderParser headerParser(){...}
- @ConditionalOnMissingBean:判断环境中没有对应的bean(根据类型或名称判断) ,没有才注册bean到IOC容器。属性为value,其值为要判断的类的全类名;name,其值为要判断的bean对象的对象名。默认为当前被注解的bean。
@Bean @ConditionalOnMissingBean //当不存在当前类型的bean时,才声明该bean public HeaderParser headerParser(){...}
- @ConditionalOnProperty:判断配置文件中有对应属性和值,有才注册bean到IOC容器。属性为name,其值为要判断的配置文件中的属性;havingValue,其值为要判断的配置文件中的属性对应的值
@Bean @ConditionalOnProperty(name = "name",havingValue = "zgg1h") //配置文件中存在对应的属性和值,才注册bean到IOC容器 public HeaderParser headerParser(){...}
自定义starter
- 在实际开发中,经常会定义一些公共组件,提供给各个项目团队使用。而在SpringBoot的项目中,一般会将这些公共组件封装为SpringBoot的starter。
- 一般在xxxx-spring-boot-starter模块中实现依赖管理功能,在xxxx-spring-boot-autoconfigure模块实现自动配置功能,并将autoconfigure模块引入到starter模块中。
步骤
- 创建xxxx-spring-boot-starter模块
- 创建xxxx-spring-boot-autoconfigure模块,在starter中引入该模块。
- 在xxxx-spring-boot-autoconfigure模块中的定义自动配置功能,并定义自动配置文件META-INF/spring/xxxx.imports。
Web后端开发总结
- Web后端开发使用到的技术及其归属框架如下:
- 其中SpringMVC、Spring Framework和Mybatis被统称为SSM。
- SpringMVC框架即为Spring Framework中的web开发模块。