Spring之IOC容器初探索

IOC是Spring整体核心,其他模块其实都是依赖IOC

IOC 控制反转 解决层层之间 耦合问题

IOC容器加载过程:(重要)

BeanFactory Spring顶层核心接口 简单工厂模式 getBean()(可以获取Bean和生产Bean);ApplicationContext实现了BeanFactory,管理Spring的生命周期

基于xml  ClassPathXmlApplicationContext
基于注解 AnnocationApplicationContext

BeanDefinition(bean定义)封装了生产了bean的原料,放在BeanDefinitionMap里
BeanDefinitionReader读取配置类
BeanDefinitionScanner扫描有效配置类
BeanDefinitionRegistry注册Bean,注册到BeanDefinition中

Bean的生命周期:整个过程中会调用9次Bean后置处理器
1.实例化,此时只是一个空壳  反射(Spring控制实例化,通过无参构造(默认),有参构造),工厂方法(自己控制@Bean)
2.填充属性 (@Autofwired @Value)
3.初始化,放在map<beanName,bean实例>,这个map是一级缓存(单例池),在初始化过程中,会调用很多Aware方法,如BeanNameAware,BeanClassLoaderAware,BeanFactoryAware等以及初始化回调:@PostConstruct标记的方法,initial lizingBean接口,initMethod方法

扩展点:
Bean工厂后置处理器BeanFactoryPostProcessor 修改Bean定义;
BeanDefinitionRegistryPostProcessor注册Bean定义;
Bean的后置处理器BeanPostProcessor;
场景:集成其它框架

AOP创建代理是在Bean生命周期完成之后,也就是初始化之后,通过PostProcessAfterInitialization实现

Spring循环依赖(A依赖B,B依赖A),通过三级缓存(就是3个map)解决

Spring之IOC容器初探索
个人总结:
IOC加载过程:
首先,我们的类要生产成一个Bean,不是一步到位的
先要将类加载成Bean定义,主要步骤是通过BeanDefinitionReader读取配置类,通过BeanDefinitionScanner扫描合格的配置类,通过BeanDefinitionRegisty注册Bean定义
Spring提供了BeanFactoryPostProcessor修改Bean定义和BeanDefinitionRegistryPostProcessor注册Bean定义的扩展节点
使用BeanFactory的getBean()方法来生产bean,判断是否符合生产标准(是不是FactoryBean,不是的话从一级缓存拿,拿到就返回,没有拿到调用createBean()方法),
接着(Bean生命周期,总共调用9次Bean的后置处理器)
1.实例化,此时只是一个空壳  反射(Spring控制实例化,通过无参构造(默认),有参构造),工厂方法(自己控制@Bean)
2.填充属性 (@Autofwired @Value)
3.初始化,放在map<beanName,bean实例>,这个map是一级缓存(单例池),在初始化过程中,会调用很多Aware方法,如BeanNameAware,BeanClassLoaderAware,BeanFactoryAware等以及初始化回调:@PostConstruct标记的方法,initial lizingBean接口,initMethod方法
最后放入一级缓存中(singletonObjects)

 


1.拿到BeanFactory  是DefaultListableBeanFactory
2.注册一些后置处理器,如:ConfigurationClassPostProcessor解析配置类(重要)(在reader中注册)
3.reader,scanner,registry
4.refresh()方法  ===> 最核心的方法 里面有13个方法

这个方法会优先创建创世纪的后置处理器

Spring之IOC容器初探索

 

BeanFactory和FactoryBean区别:
BeanFactory是spring顶层核心接口  可以生产bean
FactoryBean:当一个bean实现FactoryBean,重写getObject方法,可以指定生成什么类型的Bean,比如Car实现FactoryBean,可以在getObject()方法中返回Tank


 

上一篇:Spring介绍


下一篇:动态类型dynamic(ExpandoObject)