SpringBoot原理

1605字

SpringBoot原理学习笔记

一、配置优先级

1. 配置文件优先级

SpringBoot支持三种配置文件格式:

  1. application.properties
  2. application.yml
  3. application.yaml

优先级从高到低

  1. properties > yml > yaml
  2. 推荐统一使用yml格式

2. 外部配置方式

除了配置文件,还支持:

  1. Java系统属性:-Dkey=value
  2. 命令行参数:--key=value

五种配置方式优先级: 命令行参数 > 系统属性 > properties > yml > yaml

3. 打包后配置

运行jar包时指定参数:

1
java -Dserver.port=9000 -jar XXXX.jar --server.port=10010

二、Bean管理

1. Bean作用域

Spring支持五种作用域:

  1. singleton(默认):单例
  2. prototype:每次使用创建新实例
  3. request(web):每次HTTP请求
  4. session(web):每个HTTP会话
  5. application(web):整个Web应用生命周期

使用@Scope注解配置

1
2
3
@Scope("prototype")
@RestController
public class MyController {...}

2. 第三方Bean管理

当引入第三方依赖时,无法使用@Component注解,需要使用@Bean:

方式1:在启动类中声明

1
2
3
4
5
6
7
@SpringBootApplication
public class App {
    @Bean
    public ThirdPartyBean thirdPartyBean() {
        return new ThirdPartyBean();
    }
}

方式2(推荐):使用配置类

1
2
3
4
5
6
7
@Configuration
public class ThirdPartyConfig {
    @Bean
    public ThirdPartyBean thirdPartyBean() {
        return new ThirdPartyBean();
    }
}

三、SpringBoot原理

1. 起步依赖原理

  • 通过Maven的依赖传递实现
  • spring-boot-starter-web会自动引入web开发所需的所有依赖
  • 简化了依赖管理

2. 自动配置原理

核心注解@SpringBootApplication包含:

  1. @SpringBootConfiguration:标识为配置类
  2. @ComponentScan:组件扫描
  3. @EnableAutoConfiguration:自动配置核心

自动配置流程

  1. 通过@Import(AutoConfigurationImportSelector.class)导入配置
  2. AutoConfigurationImportSelector读取META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
  3. 加载文件中定义的配置类
  4. 配置类中通过@Bean声明bean

3. 条件装配

使用@Conditional系列注解控制bean的注册:

常用条件注解:

  • @ConditionalOnClass:存在指定类时注册
  • @ConditionalOnMissingBean:不存在指定bean时注册
  • @ConditionalOnProperty:配置文件中存在指定属性时注册

4. 自定义Starter

标准结构

  1. xxx-spring-boot-starter:依赖管理
  2. xxx-spring-boot-autoconfigure:自动配置

实现步骤

  1. 创建starter模块管理依赖
  2. 创建autoconfigure模块实现自动配置
  3. 在autoconfigure中:
    • 定义配置类用@Bean声明bean
    • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中注册配置类

示例:阿里云OSS Starter

  1. starter模块pom引入autoconfigure
  2. autoconfigure模块:
    • 定义AliyunOSSProperties保存配置
    • 定义AliyunOSSOperator工具类
    • 创建AliyunOSSAutoConfiguration配置类
    1
    2
    3
    4
    5
    6
    7
    8
    
    @Configuration
    @EnableConfigurationProperties(AliyunOSSProperties.class)
    public class AliyunOSSAutoConfiguration {
        @Bean
        public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) {
            return new AliyunOSSOperator(properties);
        }
    }
    
  3. 创建META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件指定配置类

使用

  1. 引入starter依赖
  2. 配置application.yml
  3. 直接注入使用:
1
2
@Autowired
private AliyunOSSOperator aliyunOSSOperator;

总结

  • SpringBoot通过起步依赖简化依赖管理
  • 通过自动配置简化bean配置
  • 理解原理后可以自定义starter复用通用组件
  • 条件装配使配置更加灵活智能
如对内容有异议,请联系关邮箱2285786274@qq.com修改