拆解一个具体的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()方法时:
- 创建
annotationconfigservletwebserverapplicationcontext实例(web环境下的applicationcontext实现) - 加载
@springbootapplication注解中的配置信息 - 初始化
defaultlistablebeanfactory作为底层bean工厂 - 注册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)等
- spring data jpa自动配置(
- beandefinition注册:
- 注册
usercontroller的beandefinition - 自动配置类注册大量内置beandefinition,如
dispatcherservlet、datasource、entitymanagerfactory等 userrepository通过@enablejparepositories(由@springbootapplication间接导入)被动态代理并注册
- 注册
2.2.3 阶段三:bean实例化与初始化
- 实例化bean:
- 调用
usercontroller的无参构造方法创建实例 - 创建
datasource、entitymanagerfactory等基础组件实例 - 为
userrepository创建动态代理实例
- 调用
- 依赖注入:
@autowired private userrepository userrepository;
- 容器将
userrepository的代理实例注入到usercontroller的userrepository字段中
- 容器将
- 初始化:
- 调用
usercontroller的初始化方法(如果有) - 应用
beanpostprocessor的处理,如aop代理、事务增强等
- 调用
2.2.4 阶段四:容器启动完成
- 发布
contextrefreshedevent事件 - 启动嵌入式tomcat服务器
- 注册请求映射(如
usercontroller中的@requestmapping) - 应用准备就绪,开始处理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创建的动态代理实例
- 容器在bean工厂中查找
- 依赖注入:
- 使用反射技术,将
userrepository的代理实例赋值给usercontroller的userrepository字段 - 完成注入后,
usercontroller就可以使用userrepository来操作数据了
- 使用反射技术,将
3.3 依赖注入的优势
在这个项目中,我们可以看到依赖注入的实际优势:
- 松耦合:
usercontroller不需要关心userrepository的具体实现 - 可测试性:在单元测试中,可以轻松替换
userrepository为模拟实现 - 代码简洁:不需要手动创建
userrepository实例
4. 核心组件在项目中的具体体现
4.1 beanfactory
- 实现类:
defaultlistablebeanfactory - 作用:管理项目中所有的bean,包括
usercontroller、userrepository代理、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时:
- 浏览器发送http get请求到tomcat服务器
- tomcat将请求转发给spring mvc的
dispatcherservlet dispatcherservlet查找匹配的处理器,找到usercontroller的getallusers()方法dispatcherservlet调用usercontroller实例的getallusers()方法- 在方法内部,
usercontroller使用注入的userrepository调用findall()方法 userrepository的代理实例将请求转发给底层的jpa实现- jpa执行sql查询,从h2数据库获取所有用户数据
- 结果逐层返回,最终响应给浏览器
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容器原理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论