Spring IOC 中涉及的重要接口

  • BeanDefinition

    Bean的描述信息,实现类包括 RootBeanDefinitionGenericBeanDefinition,Bean的描述信息中定义了一系列Bean的信息,比如:beanClassNamescopelazyinitdependsOnprimaryinitMethodNamedestroyMethodNameisSingtonisAbstract等信息。

  • BeanDefinitionReader

    用于解析Bean的资源阅读器,比如针对于XML文件的配置的Bean,实现类XmlBeanDefinitionReader,针对properties文件的配置的Bean,实现类为PropertiesBeanDefinitionReaderSpring在启动时会将xml文件通过loadBeanDefinitions方法进行解析。

  • BeanFactory

    IOC容器实现的顶层接口,默认的实现为DefaultListableBeanFactorySpring Bean 的整个生命周期都是由DefaultListableBeanFactory去管理的,这个类非常的重要

  • BeanFactoryPostProcessor

    这个接口是BeanFactory的增强处理器,用于在Bean加载为BeanDefinition之后的扩展,比如实现类PlaceHolderConfigurerSupport 就是用来处理占位符解析的,当我在xml文件中配置jdbc信息的时候,通过是用${xxx.jdbUrl}这种方式配置数据库连接的时候,就是通过这个类来处理和解析的。

  • Aware

    这个接口,他下面有一堆的子接口,比如BeanNameAwareApplicationContextAwareBeanFactoryAwareEnvironmentAware等,可以通过实现这些接口完成ioc容器中特定信息的设置,比如EnvironmentAware,可以在Bean创建过程中设置环境信息到对应的Bean对象中,后期通过bean对象获取环境信息数据。

  • BeanPostProcessor

    这个接口是Bean的增强处理器,用于在Bean进行初始化时调用init-method方法的前后进行增强,他有两个方法:postProcessBeforeInitializationpostProcessAfterInitialization,分别用于bean初始化方法init-method之前和之后调用,当然还可以进行很多扩展,比如aop就是通过postProcessAfterInitialization方法中去创建动态代理对象。

Spring Bean 的生命周期

  • 首先通过BeanDefinitionReader将xml中的Bean配置加载到BeanDefinition中
  • 然后将BeanDefinition放入DefaultListableBeanFacotry的beanDefinitionMap和beanDefinitionNames集合中
  • 然后调用BeanFactoryPostProcessor#postProcessorBeanFactory对容器中的BeanDefinition的属性进行增强解析
  • 然后通过反射调用对象的构造函数进行对象的实例化
  • 然后调用populateBean进行属性填充
  • 然后调用初始化方法initializeBean,初始化时又会先调用invokeAwareMethods方法执行一堆的Aware方法
  • 然后BeanPostProcessor#postProcessBeforeInitialization方法执行bean增强器的前置处理
  • 然后调用InitializingBean#afterPropertiesSet方法或者是调用自定义的init-method方法
  • 然后调用BeanPostProcessor#postProcessAfterInitialization方法执行bean增强的后置处理
  • 最后完成Bean的创建,最终放入一级缓存singletonObjects中

整体流程大概就是这个,有了整体流程就可以进行下一步Bean创建的细节解读。

Spring 源码 (1)Spring IOC Bean 创建的整体流程的更多相关文章

  1. spring源码深度解析— IOC 之 开启 bean 的加载

    概述 前面我们已经分析了spring对于xml配置文件的解析,将分析的信息组装成 BeanDefinition,并将其保存注册到相应的 BeanDefinitionRegistry 中.至此,Spri ...

  2. 【spring源码分析】IOC容器初始化(总结)

    前言:在经过前面十二篇文章的分析,对bean的加载流程大致梳理清楚了.因为内容过多,因此需要进行一个小总结. 经过前面十二篇文章的漫长分析,终于将xml配置文件中的bean,转换成我们实际所需要的真正 ...

  3. 【spring源码分析】IOC容器初始化(二)

    前言:在[spring源码分析]IOC容器初始化(一)文末中已经提出loadBeanDefinitions(DefaultListableBeanFactory)的重要性,本文将以此为切入点继续分析. ...

  4. 【spring源码分析】IOC容器初始化(三)

    前言:在[spring源码分析]IOC容器初始化(二)中已经得到了XML配置文件的Document实例,下面分析bean的注册过程. XmlBeanDefinitionReader#registerB ...

  5. 【spring源码分析】IOC容器初始化(四)

    前言:在[spring源码分析]IOC容器初始化(三)中已经分析了BeanDefinition注册之前的一些准备工作,下面将进入BeanDefinition注册的核心流程. //DefaultBean ...

  6. 【spring源码分析】IOC容器初始化(七)

    前言:在[spring源码分析]IOC容器初始化(六)中分析了从单例缓存中加载bean对象,由于篇幅原因其核心函数 FactoryBeanRegistrySupport#getObjectFromFa ...

  7. 【spring源码分析】IOC容器初始化(十)

    前言:前文[spring源码分析]IOC容器初始化(九)中分析了AbstractAutowireCapableBeanFactory#createBeanInstance方法中通过工厂方法创建bean ...

  8. 转 Spring源码剖析——核心IOC容器原理

    Spring源码剖析——核心IOC容器原理 2016年08月05日 15:06:16 阅读数:8312 标签: spring源码ioc编程bean 更多 个人分类: Java https://blog ...

  9. Spring源码分析专题 —— IOC容器启动过程(上篇)

    声明 1.建议先阅读<Spring源码分析专题 -- 阅读指引> 2.强烈建议阅读过程中要参照调用过程图,每篇都有其对应的调用过程图 3.写文不易,转载请标明出处 前言 关于 IOC 容器 ...

随机推荐

  1. Nginx--sub_filter模块

    客户端浏览器访问替换html中的字符: location / { root /web/htdocs; random_index on; index index.html index.htm; subs ...

  2. 前端知识之css样式

    前端之CSS样式 css介绍 css是为html标签设置样式的 css由选择器和声明组成 声明包括属性和属性值 声明之间用分号:隔开 css注释 /注释类容/ css的几种引入方式 行内样式 不推荐使 ...

  3. Python 局域网主机存活扫描

    #! python # -*- coding: utf-8 -*- __author__ = 'Deen' import os import threading import argparse # 从 ...

  4. Windows 如何打开 .md 文件

    •问题 最近在学习[C++|黑马程序员],对于课堂笔记中的 .md 文档无从下手,要是直接通过 Chrome 打开排版又很乱,且不能正常显示URL中的内容: 这可如何是好??? •解决方案 1. 打开 ...

  5. windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看

    windows server 2019 域控批量新增不用,只看这一篇就够了,别的不用看 1. 新建excel表格 A B C D E 姓 名 全名 登录名 密码 李 四 李四 李四 test123!@ ...

  6. [源码解析] TensorFlow 分布式环境(6) --- Master 动态逻辑

    [源码解析] TensorFlow 分布式环境(6) --- Master 动态逻辑 目录 [源码解析] TensorFlow 分布式环境(6) --- Master 动态逻辑 1. GrpcSess ...

  7. 多线程常用代码 Future Callable Runable

    public class ThreadPoolTest { public static void main(String[] args) throws InterruptedException { E ...

  8. docker之间如何通讯的

    Docker 查看容器 IP 地址   查看Docker的底层信息. docker inspect 会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息 docker inspect ...

  9. JavaScript的取值小技巧之“中括号[]取值法”

    一.简介 做下记录,今天看了一篇很有意思的文章,学到了这个取值的小技巧 正常的话我们一般都是用对象直接去'.'对应的属性名(也就是键值对的键)来获取对应的值 这里记录的是另一种取值方式,他是采用中括号 ...

  10. vulnhub mrRobot渗透笔记

    mrRobot渗透笔记 靶机下载地址:https://www.vulnhub.com/entry/mr-robot-1,151/ kali ip 信息收集 首先依旧时使用nmap扫描靶机的ip地址 n ...