Spring 的启动流程是理解其核心原理的重要部分。以下是 Spring 启动的主要流程及原理的详细介绍,并配合代码样例和分析说明。
Spring 启动流程概述
Spring 的启动流程分为以下几个步骤:
- 创建 Spring 容器:
- 初始化
ApplicationContext
,加载配置类或配置文件。 - 通过反射扫描和注册 Spring Bean。
- 初始化
- 解析配置和注解:
- 加载
@Configuration
类或 XML 文件。 - 解析注解如
@Component
,@Bean
,@Autowired
。
- 加载
- BeanFactory 初始化:
- 创建
BeanFactory
对象,用于管理 Bean 的生命周期。 - 注册 Bean 的定义信息。
- 创建
- Bean 的实例化:
- 根据依赖关系注入 (
DI
)。 - 调用构造函数、设置属性。
- 根据依赖关系注入 (
- Bean 初始化:
- 调用
@PostConstruct
、InitializingBean
、init-method
。
- 调用
- 容器启动完成:
- 启动完成后可以使用 Spring 容器中的 Bean。
核心步骤解析
以下是关键流程的详细说明及代码示例:
1. 启动 ApplicationContext
Spring 启动的入口通常是通过 ApplicationContext
接口,比如 AnnotationConfigApplicationContext
。
示例代码:
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// 配置类,用于扫描组件
}
public class Main {
public static void main(String[] args) {
// 启动 Spring 容器
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// 获取 Bean
MyService myService = context.getBean(MyService.class);
myService.doSomething();
context.close(); // 关闭容器
}
}
流程分析:
AnnotationConfigApplicationContext
是一个实现了ApplicationContext
的类。- 它会扫描
@ComponentScan
注解指定的包,找到所有的 Spring 组件。
2. 扫描和解析注解
Spring 会扫描配置类,解析 @Component
, @Bean
等注解,并注册 Bean。
示例代码:
@Component
public class MyService {
public void doSomething() {
System.out.println("MyService is working!");
}
}
@Component
public class MyRepository {
// 数据访问逻辑
}
原理:
- Spring 使用 类路径扫描 和 反射 来加载注解的类。
@ComponentScan
的实现依赖于ClasspathScanningCandidateComponentProvider
,它会扫描所有类并找出符合条件的类。
3. BeanFactory 初始化
BeanFactory
是 Spring 容器的核心,负责 Bean 的创建和管理。
关键方法:
DefaultListableBeanFactory
是 BeanFactory 的默认实现。BeanDefinition
用于描述 Bean 的定义(如类名、作用域、依赖等)。
4. Bean 的生命周期
Spring Bean 生命周期包括以下几个阶段:
- 实例化:创建 Bean 对象。
- 属性注入:根据依赖关系注入属性。
- 初始化:调用初始化方法,如
@PostConstruct
。 - 销毁:容器关闭时调用销毁方法。
示例代码:
@Component
public class MyBean {
@PostConstruct
public void init() {
System.out.println("Bean is initialized.");
}
@PreDestroy
public void destroy() {
System.out.println("Bean is destroyed.");
}
}
5. 事件发布与监听
Spring 容器启动后,可以发布和监听事件。
示例代码:
@Component
public class MyEventListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
System.out.println("Context Refreshed Event received!");
}
}
原理:
ApplicationEventPublisher
用于发布事件。- 监听器实现
ApplicationListener
接口。
总结流程
- 创建
ApplicationContext
:加载配置类。 - 扫描组件:解析
@Component
,@Bean
等注解。 - 注册 Bean 定义:将 Bean 的元数据注册到
BeanFactory
。 - 创建和初始化 Bean:完成依赖注入。
- 容器启动完成:可以使用容器中的 Bean。
如果需要深入某个具体步骤的实现细节或有其他疑问,请随时告诉我!
标签:容器,Spring,流程,Component,public,Bean,概述,class From: https://blog.csdn.net/weixin_45476869/article/details/145048676