news 2026/4/18 3:55:30

【4】Spring Boot项目中Spring核心容器原理详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【4】Spring Boot项目中Spring核心容器原理详解

拆解一个具体的spring-boot-crud-demo项目作为示例,尝试找出Spring核心容器原理在实际项目中的应用。

1. 项目结构

src/main/java/com/example/demo/ ├── SpringBootCrudDemoApplication.java # 主启动类 ├── User.java # 实体类 ├── UserController.java # 控制器 └── UserRepository.java # 数据访问接口

2. ApplicationContext容器启动过程

2.1 启动入口:主启动类

packagecom.example.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassSpringBootCrudDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(SpringBootCrudDemoApplication.class,args);}}

2.2 启动过程详解

2.2.1 阶段一:容器初始化

当我们运行SpringApplication.run()方法时:

  1. 创建AnnotationConfigServletWebServerApplicationContext实例(Web环境下的ApplicationContext实现)
  2. 加载@SpringBootApplication注解中的配置信息
  3. 初始化DefaultListableBeanFactory作为底层Bean工厂
  4. 注册Spring Boot内置的BeanPostProcessor,如自动代理创建器、配置属性绑定处理器等
2.2.2 阶段二:Bean定义加载
  1. 组件扫描@SpringBootApplication包含@ComponentScan,会扫描当前包及其子包

    • 扫描到UserController@RestController@Component的特化)
    • 不会扫描到UserRepository,因为它是接口
  2. 自动配置@SpringBootApplication包含@EnableAutoConfiguration,会加载:

    • Spring Data JPA自动配置(HibernateJpaAutoConfiguration
    • Spring Web MVC自动配置(WebMvcAutoConfiguration
    • 嵌入式Web服务器自动配置(TomcatServletWebServerFactoryAutoConfiguration)等
  3. BeanDefinition注册

    • 注册UserController的BeanDefinition
    • 自动配置类注册大量内置BeanDefinition,如DispatcherServletDataSourceEntityManagerFactory
    • UserRepository通过@EnableJpaRepositories(由@SpringBootApplication间接导入)被动态代理并注册
2.2.3 阶段三:Bean实例化与初始化
  1. 实例化Bean

    • 调用UserController的无参构造方法创建实例
    • 创建DataSourceEntityManagerFactory等基础组件实例
    • UserRepository创建动态代理实例
  2. 依赖注入

    @AutowiredprivateUserRepositoryuserRepository;
    • 容器将UserRepository的代理实例注入到UserControlleruserRepository字段中
  3. 初始化

    • 调用UserController的初始化方法(如果有)
    • 应用BeanPostProcessor的处理,如AOP代理、事务增强等
2.2.4 阶段四:容器启动完成
  1. 发布ContextRefreshedEvent事件
  2. 启动嵌入式Tomcat服务器
  3. 注册请求映射(如UserController中的@RequestMapping
  4. 应用准备就绪,开始处理HTTP请求

3. 依赖注入原理

3.1 字段注入示例

UserController中,我们使用了字段注入:

@RestController@RequestMapping("/api/users")publicclassUserController{@AutowiredprivateUserRepositoryuserRepository;// ...}

3.2 依赖注入过程详解

  1. 依赖解析

    • 容器在实例化UserController后,发现userRepository字段上有@Autowired注解
    • 确定依赖类型为UserRepository
  2. 依赖查找

    • 容器在Bean工厂中查找UserRepository类型的Bean
    • 由于UserRepository是接口,容器会查找其实现类或代理类
    • 找到由Spring Data JPA创建的动态代理实例
  3. 依赖注入

    • 使用反射技术,将UserRepository的代理实例赋值给UserControlleruserRepository字段
    • 完成注入后,UserController就可以使用userRepository来操作数据了

3.3 依赖注入的优势

在这个项目中,我们可以看到依赖注入的实际优势:

  1. 松耦合UserController不需要关心UserRepository的具体实现
  2. 可测试性:在单元测试中,可以轻松替换UserRepository为模拟实现
  3. 代码简洁:不需要手动创建UserRepository实例

4. 核心组件在项目中的具体体现

4.1 BeanFactory

  • 实现类DefaultListableBeanFactory
  • 作用:管理项目中所有的Bean,包括UserControllerUserRepository代理、DataSource
  • 位置:作为AnnotationConfigServletWebServerApplicationContext的底层实现

4.2 ApplicationContext

  • 实现类AnnotationConfigServletWebServerApplicationContext
  • 作用:提供完整的容器功能,包括Web应用支持、事件发布、资源访问等
  • 位置:通过SpringApplication.run()方法创建并返回

4.3 BeanDefinition

  • UserController的BeanDefinition

    • 类名:com.example.demo.UserController
    • 作用域:默认单例
    • 注解:@RestController@RequestMapping
    • 依赖:UserRepository
  • UserRepository的BeanDefinition

    • 类名:com.example.demo.UserRepository
    • 类型:接口
    • 实现:由Spring Data JPA动态生成

4.4 BeanPostProcessor

  • AutowiredAnnotationBeanPostProcessor:处理@Autowired注解,实现依赖注入
  • JpaRepositoryFactoryBean:创建UserRepository的代理实例
  • TransactionAnnotationBeanPostProcessor:处理@Transactional注解,实现事务管理

5. 实际运行流程

当我们访问http://localhost:8080/api/users时:

  1. 浏览器发送HTTP GET请求到Tomcat服务器
  2. Tomcat将请求转发给Spring MVC的DispatcherServlet
  3. DispatcherServlet查找匹配的处理器,找到UserControllergetAllUsers()方法
  4. DispatcherServlet调用UserController实例的getAllUsers()方法
  5. 在方法内部,UserController使用注入的userRepository调用findAll()方法
  6. userRepository的代理实例将请求转发给底层的JPA实现
  7. JPA执行SQL查询,从H2数据库获取所有用户数据
  8. 结果逐层返回,最终响应给浏览器

6. 总结

通过spring-boot-crud-demo项目,可以清晰地看到Spring核心容器在实际项目中的应用:

  1. ApplicationContext启动:从@SpringBootApplication注解开始,经历容器初始化、Bean定义加载、Bean实例化与初始化、容器启动完成四个阶段

  2. 依赖注入:通过@Autowired实现Bean之间的依赖注入,如UserController依赖UserRepository

  3. 核心组件:BeanFactory管理Bean,ApplicationContext提供完整容器功能,BeanDefinition定义Bean元数据,BeanPostProcessor增强Bean功能

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/26 3:03:39

LobeChat桌面端托盘图标提示

LobeChat桌面端托盘图标设计的工程实践与架构洞察 在如今这个信息过载、多任务并行的工作环境中,用户对效率工具的要求早已超越“功能齐全”——他们需要的是无感存在却随时可用的智能助手。当大语言模型(LLM)逐渐从实验室走向日常办公流&…

作者头像 李华
网站建设 2026/4/18 2:08:28

LobeChat Prompt模板库分享:提高对话质量的秘诀

LobeChat Prompt模板库深度解析:如何让大模型真正“听懂”你的话 在AI对话应用遍地开花的今天,打开一个聊天窗口已经不再稀奇。真正让人头疼的是——为什么同样的问题,别人问得条理清晰、答案精准,而你的提问却总被模型“误解”&a…

作者头像 李华
网站建设 2026/4/18 2:05:09

LobeChat灾备恢复进度通报

LobeChat 灾备恢复实践:从架构设计到快速重建 在 AI 应用日益深入业务核心的今天,一个看似简单的聊天界面背后,可能承载着企业客服、内部知识库甚至自动化决策的关键流程。一旦服务中断,不仅影响用户体验,更可能导致信…

作者头像 李华
网站建设 2026/4/17 20:05:42

PuzzleSolver:CTF MISC解题利器全面解析与实战指南

PuzzleSolver:CTF MISC解题利器全面解析与实战指南 【免费下载链接】PuzzleSolver 一款针对CTF竞赛MISC的工具~ 项目地址: https://gitcode.com/gh_mirrors/pu/PuzzleSolver 在CTF竞赛的MISC类别中,面对各种隐写术、文件格式混淆和数据恢复挑战&a…

作者头像 李华
网站建设 2026/4/17 23:32:51

LobeChat向上销售话术生成

LobeChat:如何用一个开源框架撬动AI产品的“向上销售”能力 你有没有遇到过这种情况?团队终于把大模型接入了系统,API也能稳定调用了,结果业务方试用后却说:“界面太简陋,员工根本不愿意用。” 或者更扎心的…

作者头像 李华
网站建设 2026/4/18 2:01:17

如何快速掌握diff-pdf:PDF文档对比的完整指南

如何快速掌握diff-pdf:PDF文档对比的完整指南 【免费下载链接】diff-pdf A simple tool for visually comparing two PDF files 项目地址: https://gitcode.com/gh_mirrors/di/diff-pdf 在文档处理工作中,PDF对比是每个职场人士都会遇到的难题。d…

作者头像 李华