14-后端Web进阶(SpringBoot原理)
1)配置优先级(谁覆盖谁)
-
配置文件三种:
application.properties / yml / yaml -
同时存在同名配置时:properties > yml > yaml
-
还支持两种外部配置:
- Java系统属性:
-Dkey=value - 命令行参数:
--key=value
- Java系统属性:
-
总优先级(低 → 高):
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 个模块
xxx-spring-boot-starter:只做依赖管理(对外入口)xxx-spring-boot-autoconfigure:写自动配置(真正注册 Bean)
-
关键流程:
- 写自动配置类(
@Configuration+@Bean) - 配置属性绑定(
@ConfigurationProperties+@EnableConfigurationProperties) - 在
AutoConfiguration.imports里写入自动配置类全类名
- 写自动配置类(
-
最终效果:业务项目只需 引 starter + 写 yml 配置,就能直接
@Autowired使用工具类