Spring 框架核心原理与实践解析

简介: 本文详解 Spring 框架核心知识,包括 IOC(容器管理对象)与 DI(容器注入依赖),以及通过注解(如 @Service、@Autowired)声明 Bean 和注入依赖的方式。阐述了 Bean 的线程安全(默认单例可能有安全问题,需业务避免共享状态或设为 prototype)、作用域(@Scope 注解,常用 singleton、prototype 等)及完整生命周期(实例化、依赖注入、初始化、销毁等步骤)。解析了循环依赖的解决机制(三级缓存)、AOP 的概念(公共逻辑抽为切面)、底层动态代理(JDK 与 Cglib 的区别)及项目应用(如日志记录)。介绍了事务的实现(基于 AOP

一、IOC 与 DI

  1. IOC(控制反转):简单说就是把对象的创建、管理权力从代码转移到 Spring 容器。原来我们需要自己new对象,现在由容器统一创建、装配对象,我们直接从容器中获取即可,这就是 “控制反转”。
  2. DI(依赖注入):容器在创建对象时,会自动把该对象依赖的其他对象注入进来。比如 Service 依赖 Dao,容器会在创建 Service 时,把 Dao 对象注入到 Service 中,不用我们手动设置。
  3. 声明 Bean 与依赖注入的方式
  • 声明 Bean:在类上加注解即可让容器管理,比如@Controller(控制层)、@Service(服务层)、@Repository(数据层,现在 MyBatis 常用@Mapper)、@Component(通用组件)、@Configuration(配置类)。
  • 依赖注入:常用@Autowired(默认按类型注入)和@Resource(默认按名称注入)。比如在 Service 中注入 Dao,加@Autowired即可。

二、Bean 的线程安全与作用域

  1. Bean 的线程安全:Spring 的 Bean 默认是单例(整个容器中只有一个实例)。多线程并发访问时,如果 Bean 有共享的成员变量,可能存在线程安全问题(Spring 没对单例 Bean 做多线程封装)。但实际开发中,Controller、Service、Dao 通常没有可变状态(成员变量不被修改),所以大多时候是安全的。如果有线程安全问题,可自己通过代码保证(如加锁),或把 Bean 的作用域设为prototype(每次获取都是新实例)。
  2. Bean 的作用域:通过@Scope注解设置,常见取值:
  • singleton:默认,单例,容器中只有一个实例。
  • prototype:多例,每次获取都是新实例。
  • request:同一个请求内用同一个实例。
  • session:同一个会话内用同一个实例。

三、Bean 的生命周期

Bean 的生命周期大致分为以下步骤:


  1. 实例化:调用构造函数创建 Bean 对象。
  2. 依赖注入:通过 set 方法等注入依赖(如@Autowired注解的属性在此步赋值)。
  3. 处理 Aware 接口:如果 Bean 实现了BeanNameAwareBeanFactoryAware等接口,会调用对应的方法(如获取 Bean 名称、容器对象)。
  4. BeanPostProcessor 前置处理:执行BeanPostProcessorpostProcessBeforeInitialization方法,对 Bean 做前置增强。
  5. 初始化:执行初始化方法,比如实现InitializingBeanafterPropertiesSet方法、加@PostConstruct注解的方法。
  6. BeanPostProcessor 后置处理:执行BeanPostProcessorpostProcessAfterInitialization方法,可能在此步生成代理对象(如 AOP 增强)。
  7. 使用:Bean 创建完成,供业务逻辑调用。
  8. 销毁:容器关闭时,执行销毁方法,比如实现DisposableBean的方法、加@PreDestroy注解的方法。

四、循环依赖

  1. 什么是循环依赖:两个或多个 Bean 互相依赖形成闭环,比如 A 依赖 B,B 依赖 A。
  2. Spring 如何解决:通过三级缓存解决大部分循环依赖:
  • 一级缓存(singletonObjects):存完全初始化的 Bean。
  • 二级缓存(earlySingletonObjects):存未完全初始化的 “半成品” Bean。
  • 三级缓存(singletonFactories):存ObjectFactory(用于创建 Bean 的工厂,可能生成代理对象)。
  1. 流程示例:创建 A 时,先把 A 的工厂存入三级缓存;A 需要 B,于是创建 B;B 需要 A 时,从三级缓存取 A 的工厂生成半成品 A,存入二级缓存,B 注入 A 后完成初始化并进入一级缓存;最后 A 注入 B,完成初始化进入一级缓存。
  2. 特殊情况:构造函数循环依赖无法通过三级缓存解决,需在构造函数参数上加@Lazy(延迟加载)。

五、AOP

  1. 什么是 AOP:面向切面编程,把日志、权限、事务等与业务无关的公共逻辑抽成 “切面”,统一增强业务方法,降低耦合。
  2. 项目中的应用:比如记录操作日志,通过自定义注解(如@Log)标记需要记录日志的方法,再定义切面类,用环绕通知(@Around)拦截这些方法,获取请求参数、操作人等信息并存入数据库。
  3. 底层实现:基于动态代理:
  • JDK 动态代理:只能代理实现接口的类,生成的代理类与被代理类是 “兄弟”(同实现一个接口)。
  • Cglib 动态代理:可代理未实现接口的类(不能代理 final 类),生成的代理类是被代理类的 “子类”,通过继承实现增强。

六、事务

  1. 事务的实现:Spring 事务底层基于 AOP,在方法执行前开启事务,执行后根据是否异常提交或回滚,通过@Transactional注解控制。
  2. 事务失效的场景
  • 方法内try-catch异常但未抛出(Spring 无法感知异常)。
  • 方法抛出检查异常(默认只回滚RuntimeException,需通过rollbackFor=Exception.class指定)。
  • 方法不是public修饰(Spring 只对 public 方法增强事务)。
  1. 事务传播行为:控制两个事务方法互相调用时的事务关系,常用:
  • REQUIRED(默认):如果有事务就加入,没有就新建。
  • REQUIRES_NEW:无论是否有事务,都新建一个独立事务。

七、常用注解

按功能分类:


  • 声明 Bean:@Component@Service@Controller@Repository@Configuration
  • 依赖注入:@Autowired(按类型)、@Resource(按名称)、@Qualifier(指定名称)。
  • 作用域:@Scope
  • AOP:@Aspect(切面)、@Pointcut(切入点)、@Before/@After/@Around(通知)。
  • 事务:@Transactional
  • 初始化 / 销毁:@PostConstruct(初始化)、@PreDestroy(销毁)。
相关文章
|
27天前
|
存储 人工智能 Java
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
本文介绍RAG(检索增强生成)技术,结合Spring AI与本地及云知识库实现学术分析AI应用,利用阿里云Qwen-Plus模型提升回答准确性与可信度。
583 90
AI 超级智能体全栈项目阶段四:学术分析 AI 项目 RAG 落地指南:基于 Spring AI 的本地与阿里云知识库实践
|
XML Java Spring
一文搞懂 Spring Boot 自动配置原理
Spring Boot 自动配置原理揭秘:通过 `@EnableAutoConfiguration` 加载 `META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports` 中的配置类,结合 `@Conditional` 按条件注入 Bean,实现“开箱即用”。核心在于约定大于配置,简化开发。
332 0
|
22天前
|
XML Java 数据格式
《深入理解Spring》:AOP面向切面编程深度解析
Spring AOP通过代理模式实现面向切面编程,将日志、事务等横切关注点与业务逻辑分离。支持注解、XML和编程式配置,提供五种通知类型及丰富切点表达式,助力构建高内聚、低耦合的可维护系统。
|
22天前
|
XML Java 测试技术
《深入理解Spring》:IoC容器核心原理与实战
Spring IoC通过控制反转与依赖注入实现对象间的解耦,由容器统一管理Bean的生命周期与依赖关系。支持XML、注解和Java配置三种方式,结合作用域、条件化配置与循环依赖处理等机制,提升应用的可维护性与可测试性,是现代Java开发的核心基石。
|
22天前
|
前端开发 Java 微服务
《深入理解Spring》:Spring、Spring MVC与Spring Boot的深度解析
Spring Framework是Java生态的基石,提供IoC、AOP等核心功能;Spring MVC基于其构建,实现Web层MVC架构;Spring Boot则通过自动配置和内嵌服务器,极大简化了开发与部署。三者层层演进,Spring Boot并非替代,而是对前者的高效封装与增强,适用于微服务与快速开发,而深入理解Spring Framework有助于更好驾驭整体技术栈。
|
22天前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
23天前
|
人工智能 监控 Java
Spring AI Alibaba实践|后台定时Agent
基于Spring AI Alibaba框架,可构建自主运行的AI Agent,突破传统Chat模式限制,支持定时任务、事件响应与人工协同,实现数据采集、分析到决策的自动化闭环,提升企业智能化效率。
Spring AI Alibaba实践|后台定时Agent
|
1月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
99 8
|
1月前
|
XML Java 应用服务中间件
【SpringBoot(一)】Spring的认知、容器功能讲解与自动装配原理的入门,带你熟悉Springboot中基本的注解使用
SpringBoot专栏开篇第一章,讲述认识SpringBoot、Bean容器功能的讲解、自动装配原理的入门,还有其他常用的Springboot注解!如果想要了解SpringBoot,那么就进来看看吧!
264 2
|
4月前
|
Java Spring 容器
SpringBoot自动配置的原理是什么?
Spring Boot自动配置核心在于@EnableAutoConfiguration注解,它通过@Import导入配置选择器,加载META-INF/spring.factories中定义的自动配置类。这些类根据@Conditional系列注解判断是否生效。但Spring Boot 3.0后已弃用spring.factories,改用新格式的.imports文件进行配置。
817 0