需完成的任务
类------------------------------------------BeanFactory----------------------------------------->Bean【BeanFactory调用getBean()生产出来的】
BeanFactory
Spring顶层核心接口,使用了简单工厂模式【根据名字,生产出不同的Bean实例】
BeanDefinitionReader:读取xml或者注解的信息
BeanDefinitionScanner:负责扫描筛选有加Bean注解的类【不是所有的类都配置了Bean】
BeanDefinitionRegistry:负责将Bean的所有信息打包到BeanDefinition中供生产,加入到BeanDefinitionMap中
BeanFactory和ApplicationContxet的区别
都有生产Bean的能力,其中ApplicationContxet是调用BeanFactory实现的
ApplicationContxet实现了BeanFactory
BeanFactory:只有一个职责就是生产Bean
ApplicationContxet:实现了AOP、国际化,事件,扫描器、读取器其他接口等等 还有扩展节点,如BeanFactoryPostprocessor【用于集成其他组件如mybatis】等
Bean的生命周期/加载过程
实例化【反射】
填充属性【@Autowire@Value】
初始化
初始化的时候还要调用各种Aware方法
put到一个Map里存起来【Map<beanname,value>
】
最终getBean就是从Map中获取【就是单例池或者一级缓存】
Bean生命周期
扩展接口BeanFactoryPostProcessor【Bean工厂的后置处理器】
主要用于在调用getBean()方法之前修改Bean定义
BeanFactoryPostprocessor还有实现类BeanFactoryRegistryPostProcessor用来注册,所以这两个扩展点十分重要
BeanPostProcessor
Bean的后置处理器
Bean的实例化的时候每个步骤前前后后都会调用BeanPostProcessor【总共会调用九次】
Bean的生命周期的初始化后进行BeanPostProcessor实现AOP功能【为了跟Bean彻底解耦】
Ioc容器加载过程-Bean的生命周期深度剖析
以加载类为例
第一步
调用父类GenericApplicationContext
的构造方法,第一步拿到Bean
工厂
父子类继承关系
回到this()中,AnnotationConfigApplicationContext
()构造方法,创建读取Bean定义
在此注册了一些处理器类,如星1解析@ComponentScan等注解
this总结1:
无参函数里面的this():总共三大步
- 加载Bean工厂,实例化一个Bean工厂
- 通过
AnnotationBeanDefinitionReader
注册了很多创世纪的处理器用来支撑AnnotationConfigApplicationContext后面的运行 - AnnotationConfigApplicationContext里还实例化Scanner用于扫描【类路径下的Bean定义扫描器】
第二步
注册我们的配置类到Bean定义里面
第三步:IOC容器刷新接口refresh()
Spring中最核心的方法,体现SpringIOC的生命周期
里面有加载Bean到销毁Bean的整个过程,都在这个方法里体现了,主要体现在里面的十三个方法
这里不作全部深入,着重几个
第一个
调用相应的Bean工厂后置处理器,实例化创世纪的类,用来解析相应注解,将生成相应的Bean到Map中
第二个
循环所有的Bean定义,注册成最终的Bean存放到单例池中
BeanFactory和FactoryBean的区别
BeanFactory顶层的核心接口,使用简单的工厂模式,负责生产Bean
FactoryBean专门用来修饰普通Bean
,如果普通Bean
实现FactoryBean
,那么就要实现FactoryBean
里面的方法getObject()
,当调用getBean()
时,调用的是getObject()方法里的,成为特殊的一个Bean,前置&符号即可获取原来的值
总结流程
- 实例化
AnnotiationConfigApplicationContxet
,会做几件事:实例化Reader来加载一些创世纪的类【创世纪类里面有解析一些注解,其中最重要的是解析配置类的处理器ConfigurationClassPostProcessor
】,然后实例化Sanner,实例化Registry【由BeanFactory的实现类实现】,执行完这两部类还没解析成Bean定义,只是把后续的一些类给准备好这些后置处理器实现了BeanFactoryPostProcssor接口,实现这个接口,就会在refresh()方法的invokeBeanFactoryPostProcessor(),在这里会调用所有实现BeanFactoryPostProcssor接口的Bean定义从而解析配置类,注册成Bean定义 - 执行完
invokeBeanFactoryPostProcessor()
我们的Bean定义就注册好了,注册好之后就会调用finishBeanFactoryInitiaization()
实例化我们所有剩余的单例,从我们的Bean定义注册成我们的Bean - getBean()会做哪些事情:判断Bean是否符合生产标准;判断是不是FactoryBean,先从一级缓存中拿
- 如果一级缓存有的话直接返回,没有的话进入下一步
- 一级缓存没有的话就给它标记正在创建以解决循环依赖,再调用doCreateBean()方法进行真正的创建,在这个过程当中会调用好多的Bean后置处理器