Spring IOC 容器启动、Bean生命周期详解
前言
在Spring IOC 和 AOP 概览中,简要介绍了IOC容器和AOP,没有深入IOC容器Bean的实例化,此文承接上文深入分析Bean的实例化过程、生命周期。
Spring IOC的过程
Spring的IoC容器在实现控制反转和依赖注入的过程中,可以划分为两个阶段:
- 容器启动
- Bean实例化
容器启动的流程
- 容器启动阶段需要扫描 XML/注解/JavaConfig 中需要被Spring管理的Bean信息
- 将Bean信息封装成
BeanDefinition
并放入beanDefinitionMap
(key:beanName, value:BeanDefinition)中。1、2步骤完成元素据的加载,真实对象还未实例化 - 遍历
beanDefinitionMap
,执行BeanFactoryPostProcessor
(Bean工厂后置处理器)来对定义好的 Bean元数据进行获取或修改。
BeanFactoryPostProcessor 用于Bean实例化前修改Bean的元数据,如修改其中bean定义的某些属性,为bean定义增加其他信息等
完成上述三步后,容器启动完成,开始实例化对象。
Bean实例化过程
(1)根据 BeanDefinition
,利用反射选择合适的构造函数实例化对象。此步只创建对象,但对象属性还没有注入,如:UserService 对象依赖 UserDao,此时 UserService 中的 UserDao 还为null。
(2)注入对象相关属性
(3) 判断 Bean 是否实现了 Aware 相关接口。xxxAware 接口用于获取 xxx资源,如实现 BeanNameAware,则在接口方法能获取到 Bean 的名称。
演示如下(引用自:认识 Aware 接口,此文也介绍了其他一些Aware 接口)
@Component(value = "testBeanName2")
public class MyBeanName implements BeanNameAware {@Overridepublic void setBeanName(String name) {System.out.println("MyBeanName-setBeanName:"+name);}
}
输出:
(4)调用 BeanPostProcessor
后置处理器的 before
方法。BeanPostProcessor
有两个方法,before
和 after
,BeanPostProcessor
是AOP实现的关键。
(5)执行 init 相关方法,如:@PostConstruct
标注的方法、实现的InitializingBean
接口方法、定义的 init-method 方法
(6)执行BeanPostProcessor
的 after
方法
上述步骤完成了Bean的实例化,Bean会一直保留在上下文容器中,直到容器被销毁。Bean销毁时,会调用配置的 destroy
方法。
总结
- Spring IOC 分为两个阶段:容器启动和Bean实例化阶段
- Spring Bean 的实例化和属性赋值(依赖注入)分两步完成,先实例再注入
- Spring Bean的生命周期中有很多的扩展接口:
Bean实例化前:可以通过BeanFactoryPostProcessor
修改BeanDefinition
中Bean的元数据。
Bean实例化后,初始化时:通过Aware
接口,获取资源
环绕Bean初始化过程:BeanPostProcessor
的 before 和 after 方法
初始化阶段:@PostConstruct等 init方法
参考
- spring-常见知识点(一)
- 【对线面试官】SpringBean生命周期
- 006 认识BeanNameAware
Spring IOC 容器启动、Bean生命周期详解相关推荐
- 【一文读懂】Spring Bean生命周期详解
Spring Bean的生命周期 1 容器初始化 BeanFactory容器初始化:包含容器创建,资源定位,载入,注册. ApplicationContext容器初始化:包含容器创建,资源定位,载入, ...
- spring一: 容器以及bean生命周期
spring框架的几个优点: 1. 轻量级 2. 针对接口编程,解耦合 3. aop编程 4. 方便集成各种优秀框架 5.非侵入式 6.容器 IOC(Inversion of Cont ...
- Bean 生命周期详解
Spring Bean 的生命周期,面试时非常容易问,这不,前段时间就有个粉丝去字节面试,因为不会回答这个问题,一面都没有过. 如果只讲基础知识,感觉和网上大多数文章没有区别,但是我又想写得稍微深入一 ...
- pring bean生命周期详解
https://my.oschina.net/u/1246663/blog/207450 上下文ApplicationContext容器中的生命周期: bean: package com.pas.se ...
- Spring学习笔记八--Bean生命周期和后置处理器
为什么80%的码农都做不了架构师?>>> Bean生命周期和后置处理器 IOC容器的bean生命周期 1.构造器或工厂方法建立bean实例 2.bean属性赋值,引用其他bea ...
- Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;
说明: (1)本篇博客主要根据案例阐述对象的声明周期: (2)其中,比较重要的是注意下这个对应关系: (3)还有就是调用[registerShutdownHook()]销毁IoC容器: 目录 一:be ...
- Spring IoC容器与Bean管理
Spring IoC容器与Bean管理 一.Spring IoC容器与Bean管理 1.Spring快速入门 IoC控制反转 DI依赖注入 Spring概述 Spring IoC初体验 使用XML方式 ...
- Spring 生命周期详解
Spring 生命周期详解 一.传统JAVA bean的生命周期 使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了. 一旦bean不再被使用,则由Java自动进行垃圾回 ...
- Spring IOC容器和Bean的配置
Spring IOC容器 和Bean的配置 : IOC和DI IOC(Inversion of Control):反转控制 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的 ...
最新文章
- 谈谈tcp/ip协议
- php sql漏洞修复,php sql注入漏洞与修复
- c语言综合程序设计问答题,C语言程序设计综合习题题目.doc
- docker二进制代码编译
- Flink Checkpoint 机制:如何保证 barrier 和数据之间不乱序?
- OpenGL(一)——OpenGL入门
- python什么是堆什么是栈_python中堆和栈_Python小知识00002
- 【转】wcf configuration
- Kubernetes详解(十九)——Kubernetes Pod控制器
- netty使用(5)client_server一发一回阐释ByteBuffer的使用
- nucleo STM32F072 PWM 测试
- 车载系统模块资料整理
- 开心网创始人兼CEO程炳皓
- FileNotFoundException(io流文件拒绝访问)
- 在web上制作动画(css3)
- 多智能体强化学习:合作关系设定下的多智能体强化学习
- 航天信息a3服务器怎么打开,航天信息-睿财A3-使用说明.doc
- js 相对路径转为绝对路径
- 迈阿密热火队全明星球员克里斯。波什的编程生活
- Codeforces Global Round 7 E. Bombs(线段树)
热门文章
- HAPPY_TOGETHER_WEEK15_ENJOY
- HAPPY2020暑假训练前复习
- 中心城镇问题(长链剖分优化树形dp)
- CF1491H Yuezheng Ling and Dynamic Tree(分块)
- 后缀自动机(SAM)构造实现过程演示+习题集锦
- 判断整除(opj)(动态规划)
- YbtOJ-染色计划【树链剖分,线段树,tarjan】
- CF786E-ALT【网络流,倍增】
- ssl2331OJ1373-鱼塘钓鱼 之2【贪心堆优化】
- Codeforces Round #673 (Div. 2)——待补 E