Spring

从概念态--->定义态的过程

1、实例化一个ApplicationContext的对象;

2:调用bean工厂后置处理器完成扫描;

3:循环解析扫描出来的类信息;

4、实例化一个BeanDefinition对象来存储解析出来的信息;

5、把实例化好的beanDefinition对象put到beanDefinitionMap当中缓存起来,

以便后面实例化bean;

6、再次调用其他bean工厂后置处理器;

从定义态到纯净态

7:当然spring还会干很多事情,比如国际化,比如注册BeanPostProcessor等

等,如果我们只关心如何实例化一个bean的话那么这一步就是spring调用

finishBeanFactoryInitialization方法来实例化单例的bean,实例化之前spring要做验证,

需要遍历所有扫描出来的类,依次判断这个bean是否Lazy,是否prototype,是否

abstract等等;

8:如果验证完成spring在实例化一个bean之前需要推断构造方法,因为spring实

例化对象是通过构造方法反射,故而需要知道用哪个构造方法;

9:推断完构造方法之后spring调用构造方法反射实例化一个对象;注意我这里说

的是对象、对象、对象;这个时候对象已经实例化出来了,但是并不是一个完整的bean,

最简单的体现是这个时候实例化出来的对象属性是没有注入,所以不是一个完整的bean;

从纯净态到成熟态

10:spring处理合并后的beanDefinition

11:判断是否需要完成属性注入

12:如果需要完成属性注入,则开始注入属性

初始化

13、判断bean的类型回调Aware接口

14、调用生命周期回调方法

15、如果需要代理则完成代理

创建完成

16、put到单例池——bean完成——存在Spring容器当中
SpringIOC流程图

Spring中非常非常多的扩展接口,当然你也不需要全部回答,可以挑重点回答: 
1. 执行BeanFactoryPostProcessor的postProcessBeanFactory方法
/***

  • 作用: 在注册BeanDefinition的可以对beanFactory进行扩展 后
  • 调用时机: Ioc加载时注册BeanDefinition 的时候会调用
    */
public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor { 
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 

 }
 }

2.执行BeanDefinitionRegistryPostProcessor的postProcessBeanDefinitionRegistry方法:

/***
*作用:动态注册BeanDefinition
* 调用时机: Ioc加载时注册BeanDefinition 的时候会调用
*/ 6 @Component
public class MyBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor { 
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
 RootBeanDefinition beanDefinition = new RootBeanDefinition(Car.class);
 registry.registerBeanDefinition("car",beanDefinition);
}

3. 加载BeanPostProcessor实现类 : 在Bean的生命周期会调用9次Bean的后置处理器
4. 创建所有单例bean
初始化阶段:
5. 初始化阶段调用XXXAware接口的SetXXXAware方法 :
生命周期回调: 初始化、销毁
6. 执行BeanPostProcessor实现类的postProcessBeforeInitialization方法 
7. 执行InitializingBean实现类的afterPropertiesSet方法
8. 执行bean的init-method属性指定的初始化方法
9. 执行BeanPostProcessor实现类的postProcessAfterInitialization方法
10. 初始化完成
11. 关闭容器,执行DiposibleBean实现类的destory
12. 执行bean的destroy-method属性指定的初始化方法

posted @ 2021-09-22 09:51  落笔生花  阅读(20)  评论(0)    收藏  举报