day06---SpringBoot原理

18 阅读2分钟

14-后端Web进阶(SpringBoot原理)

1)配置优先级(谁覆盖谁)

  • 配置文件三种:application.properties / yml / yaml

  • 同时存在同名配置时:properties > yml > yaml

  • 还支持两种外部配置:

    • Java系统属性-Dkey=value
    • 命令行参数--key=value
  • 总优先级(低 → 高):
    yaml < yml < properties < 系统属性(-D) < 命令行(-- )

  • 线上运行可这样传参:
    java -Dserver.port=9000 -jar app.jar --server.port=10010


2)Bean 管理

2.1 Bean 作用域(Scope)

  • 默认:singleton 单例(容器启动时创建)
  • 可用 @Lazy 延迟初始化(第一次用到才创建)
  • @Scope("prototype")多例(每次获取都创建新对象)
  • 实战结论:绝大多数 Bean 用单例即可

2.2 管理第三方 Bean

你自己写的类(Controller/Service/DAO)能被扫描到,所以加 @Component 之类就行。

第三方 jar 里的类你改不了源码、也扫不到包,这时就像:

“这位外包员工不在公司花名册里,你得手动把他登记进来。”

正确做法(推荐)

集中写在一个配置类里:

@Configuration
public class OSSConfig {

  @Bean
  public AliyunOSSOperator aliyunOSSOperator(AliyunOSSProperties props){
    return new AliyunOSSOperator(props);
  }
}

关键细节:

  • @Bean 方法名 = 默认 Bean 名(不写 name 的话)
  • @Bean 方法参数 = 依赖(Spring 会按类型自动注入)

3)SpringBoot 底层原理

3.1 起步依赖(starter)

  • 核心原理:Maven 依赖传递
  • 引一个 spring-boot-starter-web,自动带来 web/tomcat/json 等常用依赖

3.2 自动配置(AutoConfiguration)

  • 启动注解 @SpringBootApplication 里三件事:

    • @SpringBootConfiguration:启动类本质是配置类
    • @ComponentScan:默认只扫启动类所在包及子包
    • @EnableAutoConfiguration:自动配置核心(通过 @Import 导入一堆自动配置类)
  • 自动配置类来源:依赖 jar 包里的
    META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

  • 并不是所有 Bean 都会注册:靠 @Conditional 条件装配

    • 常见:OnClass / OnMissingBean / OnProperty

4)自定义 Starter(把“繁琐步骤”封装成“一行依赖”)

  • 标准结构:2 个模块

    1. xxx-spring-boot-starter:只做依赖管理(对外入口)
    2. xxx-spring-boot-autoconfigure:写自动配置(真正注册 Bean)
  • 关键流程:

    1. 写自动配置类(@Configuration + @Bean
    2. 配置属性绑定(@ConfigurationProperties + @EnableConfigurationProperties
    3. AutoConfiguration.imports 里写入自动配置类全类名
  • 最终效果:业务项目只需 引 starter + 写 yml 配置,就能直接 @Autowired 使用工具类