SpringBoot原理

配置优先级

SpringBoot支持三种配置文件:

  • application.properties
  • application.yml
  • application.yaml

三种配置文件的优先级顺序为:application.properties > application.yml > application.yaml

另外SpringBoot还支持两种常见的配置方式:

1.Java系统属性配置

2.命令行参数

其中配置优先级为 命令行参数 > Java系统属性配置

五种配置方式的优先级为 命令行参数 > Java系统属性配置 > application.properties > application.yml > application.yaml

Bean管理

Bean就是IOC容器中管理的对象.

Bean在Spring中支持五种作用域:

作用域 说明
singleton 容器内同名称的bean只有一个实例(单例)(默认)
prototype 每次使用该bean时会创建新的实例(非单例)
request 每个请求范围内会创建新的实例(web)
session 每个会话范围内会创建新的实例(web)
application 每个应用范围内会创建新的实例(web)

不保存数据的无状态的bean使用单例,Controller,Service,Dao等bean均属于无状态的bean。

第三方Bean

在我们项目开发当中,还有一种情况就是这个类它不是我们自己编写的,而是我们引入的第三方依赖当中提供的,那么此时我们是无法使用 @Component 及其衍生注解来声明bean的,此时就需要使用 @Bean注解来声明bean 了。

若要管理的第三方 bean 对象,建议对这些bean进行集中分类配置,可以通过 @Configuration 注解声明一个配置类。

Java 复制代码
package com.itheima.config;

import com.itheima.utils.AliyunOSSOperator;
import com.itheima.utils.AliyunOSSProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class OSSConfig {
    @Bean
    public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties ossProperties) {
        return new AliyunOSSOperator(ossProperties);
    }
}

SpringBoot原理

SpringBoot的原理就是来解析起步依赖和自动配置的原理.

假如我们没有使用SpringBoot,用的是Spring框架进行web程序的开发,此时我们就需要引入web程序开发所需要的一些依赖。

maven会通过依赖传递把所需的依赖都传递下来.起步依赖的原理就是maven的依赖传递.

自动配置

SpringBoot的自动配置就是当spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明.

SpringBoot项目中的@SpringBootApplication注解,具有包扫描的作用,但是它只会扫描启动类所在的当前包以及子包。

当我们要使用其他包下的Bean时 SpringBoot项目中的@SpringBootApplication注解扫描不到,无法获取. 此时我们可以用@ComponentScan组件扫描, @Import 导入

@ComponentScan组件扫描

java 复制代码
@SpringBootApplication
@ComponentScan({"com.itheima","com.example"}) //指定要扫描的包
public class SpringbootWebConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfigApplication.class, args);
    }
}

@Import 导入

导入形式主要有导入普通类,导入配置类,导入ImportSelector接口实现类

java 复制代码
@Import(TokenParser.class) //导入的类会被Spring加载到IOC容器中
@SpringBootApplication
public class SpringbootWebConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootWebConfigApplication.class, args);
    }
}

源码

@SpringBootApplication注解中包含了:

  • @SpringBootConfiguration
  • @EnableAutoConfiguration
  • @ComponentScan

其中 @SpringBootConfiguration中有@Configuration注解,表示启动类是一个配置类.

@ComponentScan 表示组件扫描,默认扫描启动类以及其子包下的组件

@EnableAutoConfiguration,底层是一个@Import注解, 注解中导入了 AutoConfigurationImportSelector类.

该类中有一个selectImports方法,该方法调用了 getAutoConfigurationEntry()方法获取可自动配置的配置类信息集合

getAutoConfigurationEntry()方法中调用了 getCandidateConfigurations(annotationMetadata, attributes)方法,获取在配置文件中配置的所有自动配置类的集合

getCandidateConfigurations(annotationMetadata, attributes)方法 获取所有基于 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中配置类的集合

相关推荐
IT_陈寒5 分钟前
Vue 3性能优化实战:7个关键技巧让我的应用加载速度提升50%
前端·人工智能·后端
星释4 小时前
Rust 练习册 :Leap与日期计算
开发语言·后端·rust
码事漫谈9 小时前
C++死锁深度解析:从成因到预防与避免
后端
码事漫谈9 小时前
智能体颠覆教育行业:现状、应用与未来展望调研报告
后端
蓝-萧9 小时前
【玩转全栈】----Django基本配置和介绍
java·后端
priority_key9 小时前
排序算法:堆排序、快速排序、归并排序
java·后端·算法·排序算法·归并排序·堆排序·快速排序
韩立学长9 小时前
基于Springboot的旧时月历史论坛4099k6s9(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
汤姆yu10 小时前
基于SpringBoot的动漫周边商场系统的设计与开发
java·spring boot·后端
灰小猿10 小时前
Spring前后端分离项目时间格式转换问题全局配置解决
java·前端·后端·spring·spring cloud
RedJACK~11 小时前
Go Ebiten小游戏开发:扫雷
开发语言·后端·golang