拆解一个具体的spring-boot-crud-demo项目作为示例,尝试找出Spring核心容器原理在实际项目中的应用。
1. 项目结构
src/main/java/com/example/demo/
├── SpringBootCrudDemoApplication.java # 主启动类
├── User.java # 实体类
├── UserController.java # 控制器
└── UserRepository.java # 数据访问接口
2. ApplicationContext容器启动过程

2.1 启动入口:主启动类
java
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创建动态代理实例
- 调用
-
依赖注入:
java@Autowired private UserRepository userRepository;- 容器将
UserRepository的代理实例注入到UserController的userRepository字段中
- 容器将
-
初始化:
- 调用
UserController的初始化方法(如果有) - 应用
BeanPostProcessor的处理,如AOP代理、事务增强等
- 调用
2.2.4 阶段四:容器启动完成
- 发布
ContextRefreshedEvent事件 - 启动嵌入式Tomcat服务器
- 注册请求映射(如
UserController中的@RequestMapping) - 应用准备就绪,开始处理HTTP请求
3. 依赖注入原理

3.1 字段注入示例
在UserController中,我们使用了字段注入:
java
@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功能