前言

在Spring IOC 和 AOP 概览中,简要介绍了IOC容器和AOP,没有深入IOC容器Bean的实例化,此文承接上文深入分析Bean的实例化过程、生命周期。

Spring IOC的过程

Spring的IoC容器在实现控制反转和依赖注入的过程中,可以划分为两个阶段:

  1. 容器启动
  2. Bean实例化

容器启动的流程

  1. 容器启动阶段需要扫描 XML/注解/JavaConfig 中需要被Spring管理的Bean信息
  2. 将Bean信息封装成 BeanDefinition 并放入beanDefinitionMap(key:beanName, value:BeanDefinition)中。1、2步骤完成元素据的加载,真实对象还未实例化
  3. 遍历 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有两个方法,beforeafterBeanPostProcessor是AOP实现的关键。

(5)执行 init 相关方法,如:@PostConstruct标注的方法、实现的InitializingBean接口方法、定义的 init-method 方法

(6)执行BeanPostProcessorafter方法

上述步骤完成了Bean的实例化,Bean会一直保留在上下文容器中,直到容器被销毁。Bean销毁时,会调用配置的 destroy方法。

总结

  1. Spring IOC 分为两个阶段:容器启动和Bean实例化阶段
  2. Spring Bean 的实例化和属性赋值(依赖注入)分两步完成,先实例再注入
  3. Spring Bean的生命周期中有很多的扩展接口:
    Bean实例化前:可以通过 BeanFactoryPostProcessor修改BeanDefinition中Bean的元数据。
    Bean实例化后,初始化时:通过Aware接口,获取资源
    环绕Bean初始化过程BeanPostProcessor的 before 和 after 方法
    初始化阶段:@PostConstruct等 init方法

参考

  • spring-常见知识点(一)
  • 【对线面试官】SpringBean生命周期
  • 006 认识BeanNameAware

Spring IOC 容器启动、Bean生命周期详解相关推荐

  1. 【一文读懂】Spring Bean生命周期详解

    Spring Bean的生命周期 1 容器初始化 BeanFactory容器初始化:包含容器创建,资源定位,载入,注册. ApplicationContext容器初始化:包含容器创建,资源定位,载入, ...

  2. spring一: 容器以及bean生命周期

    spring框架的几个优点: 1. 轻量级  2. 针对接口编程,解耦合   3. aop编程   4. 方便集成各种优秀框架  5.非侵入式   6.容器 IOC(Inversion of Cont ...

  3. Bean 生命周期详解

    Spring Bean 的生命周期,面试时非常容易问,这不,前段时间就有个粉丝去字节面试,因为不会回答这个问题,一面都没有过. 如果只讲基础知识,感觉和网上大多数文章没有区别,但是我又想写得稍微深入一 ...

  4. pring bean生命周期详解

    https://my.oschina.net/u/1246663/blog/207450 上下文ApplicationContext容器中的生命周期: bean: package com.pas.se ...

  5. Spring学习笔记八--Bean生命周期和后置处理器

    为什么80%的码农都做不了架构师?>>>    Bean生命周期和后置处理器 IOC容器的bean生命周期 1.构造器或工厂方法建立bean实例 2.bean属性赋值,引用其他bea ...

  6. Spring IoC容器与Bean管理18:Bean对象的作用域及生命周期三:对象生命周期;

    说明: (1)本篇博客主要根据案例阐述对象的声明周期: (2)其中,比较重要的是注意下这个对应关系: (3)还有就是调用[registerShutdownHook()]销毁IoC容器: 目录 一:be ...

  7. Spring IoC容器与Bean管理

    Spring IoC容器与Bean管理 一.Spring IoC容器与Bean管理 1.Spring快速入门 IoC控制反转 DI依赖注入 Spring概述 Spring IoC初体验 使用XML方式 ...

  8. Spring 生命周期详解

    Spring 生命周期详解 一.传统JAVA bean的生命周期 使用Java关键字 new 进行Bean 的实例化,然后该Bean 就能够使用了. 一旦bean不再被使用,则由Java自动进行垃圾回 ...

  9. Spring IOC容器和Bean的配置

    Spring IOC容器 和Bean的配置 : IOC和DI IOC(Inversion of Control):反转控制 在应用程序中的组件需要获取资源时,传统的方式是组件主动的从容器中获取所需要的 ...

最新文章

  1. 谈谈tcp/ip协议
  2. php sql漏洞修复,php sql注入漏洞与修复
  3. c语言综合程序设计问答题,C语言程序设计综合习题题目.doc
  4. docker二进制代码编译
  5. Flink Checkpoint 机制:如何保证 barrier 和数据之间不乱序?
  6. OpenGL(一)——OpenGL入门
  7. python什么是堆什么是栈_python中堆和栈_Python小知识00002
  8. 【转】wcf configuration
  9. Kubernetes详解(十九)——Kubernetes Pod控制器
  10. netty使用(5)client_server一发一回阐释ByteBuffer的使用
  11. nucleo STM32F072 PWM 测试
  12. 车载系统模块资料整理
  13. 开心网创始人兼CEO程炳皓
  14. FileNotFoundException(io流文件拒绝访问)
  15. 在web上制作动画(css3)
  16. 多智能体强化学习:合作关系设定下的多智能体强化学习
  17. 航天信息a3服务器怎么打开,航天信息-睿财A3-使用说明.doc
  18. js 相对路径转为绝对路径
  19. 迈阿密热火队全明星球员克里斯。波什的编程生活
  20. Codeforces Global Round 7 E. Bombs(线段树)

热门文章

  1. HAPPY_TOGETHER_WEEK15_ENJOY
  2. HAPPY2020暑假训练前复习
  3. 中心城镇问题(长链剖分优化树形dp)
  4. CF1491H Yuezheng Ling and Dynamic Tree(分块)
  5. 后缀自动机(SAM)构造实现过程演示+习题集锦
  6. 判断整除(opj)(动态规划)
  7. YbtOJ-染色计划【树链剖分,线段树,tarjan】
  8. CF786E-ALT【网络流,倍增】
  9. ssl2331OJ1373-鱼塘钓鱼 之2【贪心堆优化】
  10. Codeforces Round #673 (Div. 2)——待补 E