一、Vue 组件生命周期
父子组件生命周期顺序:
创建时:
父 beforeCreate → 父 created → 父 beforeMount → 子组件生命周期 → 父 mounted
更新时:
父 beforeUpdate → 子组件更新 → 父 updated。
销毁时:
父 beforeDestroy → 子组件销毁 → 父 destroyed。
二、Spring Boot 应用生命周期
Spring Boot 应用从启动到关闭的全过程可分为三个阶段,开发者可通过扩展点介入控制。
- 启动阶段:
初始化SpringApplication:创建实例,准备启动参数。
运行SpringApplication:调用run()方法启动应用。
发布事件:ApplicationStartingEvent,标志应用开始启动。
- 配置加载阶段:
加载默认配置:从spring-boot-starter-parent继承。
加载应用配置:从application.properties或application.yml加载。
加载环境配置:根据激活的Profile加载特定配置。
- Bean创建阶段:
组件扫描:扫描带有@Component等注解的类。
Bean定义:解析@Bean注解的方法。
依赖注入:通过@Autowired等注解注入依赖。
- 上下文刷新阶段:
刷新上下文:初始化非懒加载的Bean。
发布事件:ApplicationEnvironmentPreparedEvent、ApplicationPreparedEvent、ApplicationStartedEvent。
- Web服务器启动阶段:
启动嵌入式服务器:如Tomcat,开始监听端口。
注册Servlet和Filter:配置DispatcherServlet处理请求。
应用运行阶段:
处理请求:接收并路由HTTP请求到控制器。
定时任务和异步处理:执行@Scheduled任务和@Async方法。
- 关闭阶段:
接收关闭信号:如SIGTERM或调用shutdown()。
执行关闭逻辑:停止服务器,销毁Bean。
发布事件:ApplicationExitEvent,表示应用已退出。
三、Spring Bean 应用生命周期
-
实例化前
元信息解析:容器解析配置文件(XML/Java/注解)中的 Bean 定义,生成 BeanDefinition 对象。
验证 Bean 的依赖关系是否满足(如循环依赖检测) -
实例化
反射创建:通过默认构造函数或无参工厂方法创建 Bean 实例。
单例 vs 原型:
单例(Singleton):容器启动时立即实例化。
原型(Prototype):每次通过 getBean() 获取时创建新实例。 -
属性赋值
依赖注入:通过 @Autowired、@Value 或 XML 的 注入属性值。
依赖解析:解析 Bean 之间的引用关系,确保依赖项已初始化。 -
初始化前
BeanPostProcessor 前处理:调用 postProcessBeforeInitialization,允许修改 Bean 或添加代理(如 AOP)。 -
初始化
BeanNameAware:注入 Bean 的名称。
BeanFactoryAware:注入 BeanFactory 实例。
ApplicationContextAware:注入应用上下文。
自定义初始化:
@PostConstruct 注解方法。
实现 InitializingBean 接口的 afterPropertiesSet()。
XML 配置的 init-method。
6. 初始化后
BeanPostProcessor 后处理:调用 postProcessAfterInitialization,完成最终增强(如生成动态代理)。
7. 使用阶段
就绪状态:Bean 已完全初始化,可供应用调用
8. 销毁前
DestructionAwareBeanPostProcessor 处理:执行销毁前的扩展逻辑(如关闭资源检查)。
9. 销毁
自定义销毁:
@PreDestroy 注解方法。
实现 DisposableBean 接口的 destroy()。
XML 配置的 destroy-method。
作用域影响:
单例:容器关闭时自动触发销毁。
原型/请求/会话:需手动调用 destroy() 或依赖作用域结束。
最佳实践
资源管理:
在 @PostConstruct 中初始化外部资源(如数据库连接)。
在 @PreDestroy 中释放资源(如关闭文件句柄)。
避免循环依赖 单出一篇 :
使用 @Lazy 延迟加载依赖项。
通过接口解耦设计。
作用域选择:
默认使用单例,频繁创建或需隔离状态的 Bean 使用原型。
调试工具:
启用 DEBUG 日志观察 Bean 生命周期。
使用 Spring Boot Actuator 的 /beans 端点查看 Bean 状态。