13. 配置优先级 + Bean的管理 + SpringBoot核心原理

SpringBoot原理笔记

一、配置优先级

(一)核心配置文件优先级

SpringBoot支持application.propertiesapplication.ymlapplication.yaml三种配置文件,优先级从高到低为:

  1. application.properties(最高)
  2. application.yml
  3. application.yaml(最低)

测试验证

  • 三者共存时,properties配置生效(如Tomcat端口优先取properties的8081)
  • yamlyml共存时,yml配置生效
  • 开发建议:统一使用yml格式(主流选择)

(二)扩展配置方式及优先级

除核心配置文件外,支持两种外部配置方式,完整优先级排序(从高到低):

  1. 命令行参数(格式:--key=value,如--server.port=10010
  2. Java系统属性(格式:-Dkey=value,如-Dserver.port=9000
  3. application.properties
  4. application.yml
  5. application.yaml

(三)配置方式使用

  1. 开发环境(IDEA):
    • 编辑启动配置 → Modify options → 勾选Add VM options(配置系统属性)和Program arguments(配置命令行参数)
  2. 生产环境(打包后):
    • 命令格式:java -Dserver.port=9000 -jar XXX.jar --server.port=10010(命令行参数优先级更高)
  3. 注意事项:打包需引入spring-boot-maven-plugin插件(官网骨架项目自动添加)

二、Bean的管理

(一)Bean的作用域

Spring支持5种作用域,后3种仅web环境生效:

作用域 说明 生效环境
singleton 单例(默认),容器启动时创建 所有环境
prototype 多例,每次获取时创建新实例 所有环境
request 每个HTTP请求创建一个实例 web环境
session 每个HTTP会话创建一个实例 web环境
globalSession 全局会话共享一个实例(Portlet环境) web环境(Portlet)

配置方式 :使用@Scope注解(如@Scope("prototype")
关键说明

  • 单例Bean默认容器启动时创建,可通过@Lazy注解延迟到首次使用时初始化
  • 实际开发中90%以上Bean使用单例,无需手动配置scope

(二)第三方Bean管理

1. 场景说明

第三方依赖中的类(如阿里云OSS工具类)无法添加@Component及其衍生注解,需通过@Bean注解声明Bean。

2. 配置方式
  1. 直接在启动类声明(不推荐):
java 复制代码
@SpringBootApplication
public class Application {
    @Bean // 方法名默认作为Bean名称,可通过name/value属性指定
    public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) {
        return new AliyunOSSOperator(properties); // 依赖Bean直接通过形参注入
    }
}
  1. 集中配置类(推荐):
java 复制代码
@Configuration // 标识配置类
public class OSSConfig {
    @Bean
    public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) {
        return new AliyunOSSOperator(properties);
    }
}

三、SpringBoot核心原理

SpringBoot的核心优势是简化配置 ,底层依赖两大核心机制:起步依赖自动配置

(一)起步依赖(Starter)

1. 解决问题

传统Spring开发需手动管理大量依赖及版本冲突,起步依赖通过Maven依赖传递自动引入所需依赖。

2. 原理
  • 起步依赖本质是Maven依赖组合,如spring-boot-starter-web包含Tomcat、SpringMVC、JSON等web开发必备依赖
  • 命名规范:官方 starter 命名为spring-boot-starter-xxx(如spring-boot-starter-jdbc),第三方 starter 命名为xxx-spring-boot-starter(如mybatis-spring-boot-starter

(二)自动配置(AutoConfiguration)

1. 核心目标

SpringBoot启动时自动加载所需配置类和Bean,无需手动XML或注解配置。

2. 实现流程(源码跟踪)
  1. 入口注解:@SpringBootApplication(组合3个核心注解)

    • @SpringBootConfiguration:标识启动类为配置类(底层含@Configuration
    • @ComponentScan:扫描启动类所在包及子包的@Component注解Bean
    • @EnableAutoConfiguration:自动配置核心注解(关键)
  2. @EnableAutoConfiguration原理:

    • 底层通过@Import(AutoConfigurationImportSelector.class)导入配置选择器
    • AutoConfigurationImportSelectorselectImports()方法读取所有依赖中META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件
    • 该文件中配置了所有自动配置类(如GsonAutoConfigurationDataSourceAutoConfiguration),SpringBoot会加载这些配置类并注册Bean
  3. 条件装配(@Conditional系列注解)

    自动配置类并非无条件生效,需满足特定条件才会注册Bean,核心条件注解:

    | 注解 | 作用 |

    |---------------------|---------------------------------------|

    | @ConditionalOnClass | 环境中存在指定类才生效(如Gson.class) |

    | @ConditionalOnMissingBean | 环境中不存在指定Bean才生效(避免覆盖用户自定义Bean) |

    | @ConditionalOnProperty | 配置文件中存在指定属性及值才生效(如name: itheima) |

示例:Gson自动配置类

java 复制代码
@AutoConfiguration // 标识自动配置类
@ConditionalOnClass(Gson.class) // 存在Gson依赖才生效
@EnableConfigurationProperties(GsonProperties.class)
public class GsonAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean // 用户未自定义Gson时才自动配置
    public Gson gson(GsonBuilder builder) {
        return builder.create();
    }
}

(三)自定义Starter(实战)

1. 场景

封装通用功能(如阿里云OSS)为Starter,供多个项目复用,简化配置。

2. 实现步骤(以aliyun-oss-spring-boot-starter为例)
  1. 创建两个模块:

    • aliyun-oss-spring-boot-starter:依赖管理模块(仅声明依赖,无业务代码)
    • aliyun-oss-spring-boot-autoconfigure:自动配置模块(核心代码)
  2. 依赖管理模块(starter):

xml 复制代码
<<dependencies>
    <!-- 引入自动配置模块 -->
    <dependency>
        <groupId>com.aliyun.oss</groupId>
        <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>
</</dependencies>
  1. 自动配置模块(autoconfigure):

    • 步骤1:编写属性封装类(绑定配置文件)
    java 复制代码
    @Data
    @ConfigurationProperties(prefix = "aliyun.oss") // 绑定配置前缀
    public class AliyunOSSProperties {
        private String endpoint;
        private String bucketName;
    }
    • 步骤2:编写工具类(无需@Component
    java 复制代码
    public class AliyunOSSOperator {
        private final AliyunOSSProperties properties;
        
        // 构造注入属性
        public AliyunOSSOperator(AliyunOSSProperties properties) {
            this.properties = properties;
        }
        
        // 文件上传、下载等业务方法...
    }
    • 步骤3:编写自动配置类
    java 复制代码
    @Configuration
    @EnableConfigurationProperties(AliyunOSSProperties.class) // 启用属性绑定
    @ConditionalOnClass(AliyunOSSOperator.class) // 存在工具类才生效
    public class AliyunOSSAutoConfiguration {
        @Bean
        @ConditionalOnMissingBean
        public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties properties) {
            return new AliyunOSSOperator(properties);
        }
    }
    • 步骤4:配置自动配置文件
      resources/META-INF/spring/下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,添加:

      复制代码
      com.aliyun.oss.AliyunOSSAutoConfiguration
  2. 测试使用:

    • 引入Starter依赖
    • 配置文件添加:
    yaml 复制代码
    aliyun:
      oss:
        endpoint: https://oss-cn-beijing.aliyuncs.com
        bucketName: test-bucket
    • 直接注入使用:
    java 复制代码
    @RestController
    public class UploadController {
        @Autowired
        private AliyunOSSOperator ossOperator;
        
        // 文件上传接口...
    }

四、核心总结

  1. 配置优先级:命令行参数 > Java系统属性 > properties > yml > yaml
  2. Bean管理:单例为默认作用域,第三方Bean通过@Bean+配置类声明
  3. SpringBoot原理:
    • 起步依赖:Maven依赖传递,简化依赖管理
    • 自动配置:通过@EnableAutoConfiguration加载配置文件中的自动配置类,结合@Conditional条件装配Bean
  4. 自定义Starter:分离依赖管理和自动配置,通过配置文件暴露自动配置类,实现功能复用
相关推荐
Moe48813 小时前
Elasticsearch 8.1 Java API Client 客户端使用指南(索引、文档操作篇)
java·后端·面试
洋亦13 小时前
GoF23种设计模式 简介
java
Q_Q51100828513 小时前
python+django/flask+vue基于spark的西南天气数据的分析与应用系统
spring boot·python·spark·django·flask·node.js
Javatutouhouduan13 小时前
Java面试常问Redis核心知识点整理!
java·数据库·redis·java面试·后端开发·java架构师·java程序员
AAA简单玩转程序设计13 小时前
谁说Java枚举只是“常量装盒”?它藏着这些骚操作
java·前端
枯基Evan13 小时前
applicationTaskExecutor Spring 内置线程池失效
java·数据库·spring
优爱蛋白13 小时前
IL-21:后Th1/Th2时代的免疫新星
java·服务器·前端·人工智能·健康医疗
温宇飞13 小时前
SQL 语法基础指南
后端
Dolphin_Home13 小时前
【实用工具类】NullSafeUtils:一站式解决Java空值安全与通用操作(附完整源码)
java·网络·spring boot·后端·spring