当前位置: 代码网 > it编程>编程语言>Java > Spring Boot项目中Spring容器原理解析

Spring Boot项目中Spring容器原理解析

2025年12月18日 Java 我要评论
拆解一个具体的spring-boot-crud-demo项目作为示例,尝试找出spring核心容器原理在实际项目中的应用。1. 项目结构src/main/java/com/example/demo/├

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

1. 项目结构

src/main/java/com/example/demo/
├── springbootcruddemoapplication.java  # 主启动类
├── user.java                           # 实体类
├── usercontroller.java                 # 控制器
└── userrepository.java                 # 数据访问接口

2. applicationcontext容器启动过程

2.1 启动入口:主启动类

package com.example.demo;
import org.springframework.boot.springapplication;
import org.springframework.boot.autoconfigure.springbootapplication;
@springbootapplication
public class springbootcruddemoapplication {
    public static void main(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定义加载

  • 组件扫描@springbootapplication包含@componentscan,会扫描当前包及其子包
    • 扫描到usercontroller@restcontroller@component的特化)
    • 不会扫描到userrepository,因为它是接口
  • 自动配置@springbootapplication包含@enableautoconfiguration,会加载:
    • spring data jpa自动配置(hibernatejpaautoconfiguration
    • spring web mvc自动配置(webmvcautoconfiguration
    • 嵌入式web服务器自动配置(tomcatservletwebserverfactoryautoconfiguration)等
  • beandefinition注册
    • 注册usercontroller的beandefinition
    • 自动配置类注册大量内置beandefinition,如dispatcherservletdatasourceentitymanagerfactory
    • userrepository通过@enablejparepositories(由@springbootapplication间接导入)被动态代理并注册

2.2.3 阶段三:bean实例化与初始化

  • 实例化bean
    • 调用usercontroller的无参构造方法创建实例
    • 创建datasourceentitymanagerfactory等基础组件实例
    • userrepository创建动态代理实例
  • 依赖注入
  • @autowired
    private userrepository userrepository;
    
    • 容器将userrepository的代理实例注入到usercontrolleruserrepository字段中
  • 初始化
    • 调用usercontroller的初始化方法(如果有)
    • 应用beanpostprocessor的处理,如aop代理、事务增强等

2.2.4 阶段四:容器启动完成

  1. 发布contextrefreshedevent事件
  2. 启动嵌入式tomcat服务器
  3. 注册请求映射(如usercontroller中的@requestmapping
  4. 应用准备就绪,开始处理http请求

3. 依赖注入原理

3.1 字段注入示例

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

@restcontroller
@requestmapping("/api/users")
public class usercontroller {
    @autowired
    private userrepository userrepository;
    // ...
}

3.2 依赖注入过程详解

  • 依赖解析
    • 容器在实例化usercontroller后,发现userrepository字段上有@autowired注解
    • 确定依赖类型为userrepository
  • 依赖查找
    • 容器在bean工厂中查找userrepository类型的bean
    • 由于userrepository是接口,容器会查找其实现类或代理类
    • 找到由spring data jpa创建的动态代理实例
  • 依赖注入
    • 使用反射技术,将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核心容器在实际项目中的应用:

  • applicationcontext启动:从@springbootapplication注解开始,经历容器初始化、bean定义加载、bean实例化与初始化、容器启动完成四个阶段
  • 依赖注入:通过@autowired实现bean之间的依赖注入,如usercontroller依赖userrepository
  • 核心组件:beanfactory管理bean,applicationcontext提供完整容器功能,beandefinition定义bean元数据,beanpostprocessor增强bean功能

到此这篇关于spring boot项目中spring核心容器原理详解的文章就介绍到这了,更多相关springboot项目spring容器原理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com