SpringBoot配置原理

配置优先级

配置文件优先级

Java系统属性/命令行参数

优先级排序

Bean类的管理

bean的获取

注入一个IOC容器对象,通过调用IOC对象里的方法获取bean对象

bean的作用域配置

序号作用域名称关键字实例数量 / 创建时机适用场景备注
1单例singleton一个实例(默认)/ 容器启动时(懒加载除外)无状态 Bean,如 Service、DAO、Controller。默认值,最常用。
2原型prototype每次请求创建一个新实例。有状态 Bean,如 ThreadLocal 工具类、每次需要独立数据的对象。Spring 不负责销毁
3请求request一次 HTTP 请求创建一个新实例。存储与当前请求相关的数据。仅限 Web 环境。
4会话session一个 HTTP Session创建一个新实例。存储用户会话数据,如购物车、登录信息。仅限 Web 环境。
5应用application一个 Web 应用创建一个新实例。存储应用级的共享配置或计数器。类似于 singleton 但绑定到 ServletContext
6WebSocketwebsocket一个 WebSocket 会话创建一个新实例。专用于 WebSocket 连接。仅限 WebSocket 环境。

⚠️ 关键点回顾

  • 默认值: 如果不指定,所有 Bean 默认为 singleton

  • 有状态 vs. 无状态: 无状态的 Bean(不持有业务数据)使用 singleton有状态的 Bean(持有特定数据)使用 prototype 或 Web 作用域。

  • 作用域冲突: 当长生命周期的 Bean 依赖短生命周期的 Bean 时,需使用 proxyMode(如 ScopedProxyMode.TARGET_CLASS)来解决。

@Scope注释作用于bean类声明bean作用域

@Lazy注解:作用于bean类,延迟bean初始化直到第一次使用则会创建bean对象实例

第三方bean的配置

通过@bean注解声明第三方bean对象:

定义一个新配置类中通过创建一个方法返回一个bean对象实例,springboot通过@bean注解识别该bean对象并存储在IOC容器中

Springboot原理

起步依赖

通过Maven的依赖传递,使引入一个依赖后,会自动的引入该依赖的依赖,从而实现手动引入一个依赖即可自动引入多个依赖

自动配置⭐️⭐️

自动配置:

方案1:@ComponentScan注解进行组件扫描指定扫描的包

方案2:@import导入

原理

启动类注解@SpringBootApplication

当启动一个 Spring Boot 应用时,入口类上的 @SpringBootApplication 注解是关键。这个注解实际上是三个注解的组合:

  • @SpringBootConfiguration: 相当于 @Configuration,声明这是一个配置类。

  • @EnableAutoConfiguration: 这是实现自动配置的核心注解。

  • @ComponentScan: 启用组件扫描,找到你编写的 Bean。

@EnableAutoConfiguration注解(核心注解)

@EnableAutoConfiguration 负责启用 Spring Boot 的自动配置机制。它的工作原理是:

2.1. 查找自动配置类位置

@EnableAutoConfiguration 通过 @Import(AutoConfigurationImportSelector.class) 引入了 AutoConfigurationImportSelector 类。

2.2. 加载配置类列表

AutoConfigurationImportSelector 的核心任务是:

  • 查找所有 JAR 包中的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件(在 Spring Boot 2.7.x 及更高版本中,早期版本是 META-INF/spring.factories)。

  • 这些文件里,以键值对的形式列出了所有可用的自动配置类(例如 RedisAutoConfiguration, WebMvcAutoConfiguration 等)。

2.3. 筛选和排除配置类

加载到所有配置类列表后,Spring Boot 会进行筛选,决定哪些类应该被加载:

  • @Conditional 注解家族是筛选的关键

@Conditional条件装配注解(核心机制)
注解描述示例
@ConditionalOnClassClasspath 中存在指定的类时,配置类生效。如果检测到 Jedis 类,则 RedisAutoConfiguration 生效。
@ConditionalOnMissingClassClasspath 中不存在指定的类时,配置类生效。
@ConditionalOnBean当 Spring 容器中存在指定的 Bean 时,配置类生效。
@ConditionalOnMissingBean当 Spring 容器中不存在指定的 Bean 时,配置类生效。这用于确保如果你自己定义了 Bean,自动配置就会退避("用户优先" 原则)。
@ConditionalOnProperty当指定的配置属性(如 application.properties 中的键值对)满足特定条件时,配置类生效。只有配置了 spring.data.redis.host 时,RedisAutoConfiguration 才完全启用。
@ConditionalOnWebApplication仅在这是一个 Web 应用 (有 ServletContextReactiveType 环境) 时生效。

自动配置类的作用

每一个自动配置类(例如 DataSourceAutoConfiguration)本身也是一个 @Configuration 配置类。

  • 在这个配置类内部,它会定义并配置应用程序所需的 Bean(例如 DataSource Bean, JdbcTemplate Bean, RedisTemplate Bean 等)。

  • 这些 Bean 的创建和配置往往依赖于 @ConditionalOnMissingBean,以确保用户自定义的 Bean 具有最高的优先级

总结流程

  1. 启动: @SpringBootApplication 启用。

  2. 触发: 其中的 @EnableAutoConfiguration 引导自动配置过程。

  3. 加载: AutoConfigurationImportSelector 扫描所有 JAR 包中的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件,获取所有可能的自动配置类列表。

  4. 筛选: 对列表中的每一个自动配置类,利用 @Conditional 注解家族进行条件判断(如检查 Classpath 中是否有对应的依赖、配置属性是否设置等)。

  5. 配置: 条件成立的自动配置类被加载到 Spring 容器中,它们负责创建并配置应用程序所需的 Bean。

自动配置starter

web后端总结

技术/概念英文全称解释
SpringBoot🚀 快速开发框架。 它不是一个新的框架,而是 Spring 框架的脚手架自动化配置工具。它简化了 Spring 应用的搭建、配置和部署过程,让开发者可以“开箱即用”。
IOCInversion of Control (控制反转)核心设计原则。 指对象的创建、依赖关系的管理等控制权,从应用程序代码中转移到 Spring 容器。
DIDependency Injection (依赖注入)IOC 的实现方式。 容器在对象创建时,自动将它依赖的其他对象(Bean)注入到其中(通过构造器、Setter 或字段)。
AOPAspect-Oriented Programming (面向切面编程)解耦横切关注点。 允许开发者将系统中共用的、与核心业务无关的功能(如日志、事务、权限)从业务逻辑中分离出来,单独进行模块化管理。
事务管理Transaction Management数据一致性保证。 Spring 提供了统一的事务管理机制,确保一组数据库操作要么全部成功提交,要么全部失败回滚,保证数据的原子性和一致性。
全局异常处理Global Exception Handling统一错误响应。 通过 AOP 或特定的 Spring MVC 注解(如 @ControllerAdvice),集中处理整个应用中抛出的所有异常,并将其封装成统一、友好的 JSON 格式响应给前端。
拦截器InterceptorWeb 请求的前后处理。 属于 Spring MVC 机制。在请求进入 Controller 之前或返回之后执行逻辑,常用于登录校验、权限检查、请求参数预处理等。
技术/概念解释
MyBatis🔗 流行的持久层框架。 它通过 XML 或注解方式,将 Java 对象与 SQL 语句关联起来。它避免了手动编写 JDBC 代码,允许开发者更灵活地控制 SQL 语句,实现数据访问。
技术/概念关键职能与拦截器的区别
过滤器 (Filter)请求和响应的预处理和后处理。 它们在 Servlet 容器中运行,是请求进入 Spring MVC 调度器(DispatcherServlet)之前的第一道关卡,也是响应离开之前的最后一道关卡。作用范围广且底层: 作用于整个 Web 应用的 URL 模式,可以修改请求/响应头或数据流,常用于编码、CORS(跨域)处理、安全日志等。
Cookie客户端状态存储。 服务器发送给浏览器的小段数据,浏览器下次请求时会带上。主要用于跟踪会话 ID(Session ID)、用户偏好设置或“记住我”功能。限制大小(通常 4KB),安全性较低(容易被篡改)。
Session服务器端会话管理。 基于 Cookie(或 URL 重写)中的 Session ID,服务器在内存或数据库中保存用户状态数据。安全性高: 敏感数据存储在服务器端。但在分布式环境(多台服务器)中,需要额外的技术(如 Redis)来共享 Session。
技术/概念核心解决的问题在现代架构中的作用
JWT (JSON Web Token)无状态认证和授权。 解决了传统 Session 在分布式部署时需要共享状态的复杂性。适用于 API 和微服务: 用户登录成功后,服务器生成一个包含用户信息的 JWT 并返回给客户端。客户端在后续请求中携带此 Token,服务器只需验证 Token 签名即可确认用户身份,无需查询 Session 存储。
阿里云 OSS (Object Storage Service)海量非结构化数据存储和访问。 解决了应用服务器存储图片、视频、文档等文件占用大量资源且不易扩展的问题。实现动静分离: 应用服务器(处理业务逻辑)不再直接存储或提供静态文件,而是将文件上传到 OSS。用户请求时,直接通过 CDN(内容分发网络)访问 OSS 上的文件,极大地减轻了应用服务器的压力和带宽消耗。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值