springfy笔记
2021-08-12 17:57:30 0 举报
fy笔记
作者其他创作
大纲/内容
不满足条件
实例化前的处理,给 InstantiationAwareBeanPostProcessor 一个机会返回代理对象来替代真正的 bean 实例,从而跳过 Spring 默认的实例化过程,达到“短路”效果
没有
执行内容
通过beanName获取bean实例 this.getBean(beanName);
使用工厂方法对Bean进行实例化
2.获取对象的构造函数
finishBeanFactoryInitialization(beanFactory) 方法该方法会实例化所有剩余的非懒加载单例 bean。除了一些内部的 bean、实现了 BeanFactoryPostProcessor 接口的 bean、实现了 BeanPostProcessor 接口的 bean,其他的非懒加载单例 bean 都会在这个方法中被实例化,并且 BeanPostProcessor 的触发也是在这个方法中。 它完成了所有非懒加载的单例Bean的实例化和初始化,属性的填充以及解决了循环依赖等问题。
资源加载器获取要读入的资源:XmlBeanDefinitionReader度如期通过调用其父类DefaultResourceLoader的getResource方法获取要加载的资源
验证不是抽象类 && 是单例 && 不是懒加载
返回singletonObject
遍历beanNames,触发所有非懒加载单例bean的初始化
经过对Spring Bean定义资源文件转换的Document对象中的元素层层解析,Spring IoC现在已经将XML形式定义的Bean定义资源文件转换为Spring IoC所识别的数据结构——BeanDefinition,它是Bean定义资源文件中配置的POJO对象在Spring IoC容器中的映射,
注册所有的 BeanPostProcessor,将所有实现了 BeanPostProcessor 接口的类加载到 BeanFactory 中。
// 1.从单例对象缓存中singletonObject 获取beanName对应的单例对象/ 2.如果单例对象缓存中没有,并且该beanName对应的单例bean正在创建中(SingletonCurrentlyInCreation)
如果单例对象缓存中没有,并且该beanName对应的单例bean正在创建中*(singletonsCurrentlyInCreation)
doGetBean用来判断初始化bean的时候是否存在在容器中-> Object singletonObject = this.singletonObjects.get(beanName);判断一级缓存单例池singletonObjects中有没有手动注册的单例对象
不满足条件(bean没有被创建)
3.使用BeanUtils实例化,通过反射机制调用”构造方法.newInstance(arg)”来进行实例化
将DOM对象转换成beanDefinition
否
使用默认的无参构造方法实例化Bean对象 instantiateBean()
移除该beanName对应的单例对象工厂,this.singletonFactories.remove(beanName);
如果在早期单例对象缓存中也没有,并且支持循环依赖
有
如果Bean有方法被覆盖了,则使用JDK的反射机制进行实例化
然后经过转化为IO流等操作(XmlBeanDefinitionReader加载Bean定义资源)
从二级缓存中获取(单例工厂缓存中获取beanName的单例工厂) ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName);
isFactoryBean(beanName)判断beanName对应的bean是否为FactoryBean
Beanfactory指的是 IOC 容器的编程抽象
4、创建DefaultListableBeanFactory,并调用loadBeanDefinitions(beanFactory)装载bean定义5、转到XmlBeanDefinitionReader中的loadBeanDefinitions。6、XmlBeanDefinitionReader通过调用其父类DefaultResourceLoader的getResource方法获取要加载的资源7 、DocumentLoader将Bean定义资源转换成Document对象8、doLoadBeanDefinitions中进入registerBeanDefinitions 解 析 D ocument对象9、DefaultListableBeanFactory中使用一个HashMap的集合对象存放IoC容器中注册解析的BeanDefinition,
finishBeanFactoryInitialization
Bean的加载会读到配置文件,解析成DOM对象
this.earlySingletonObjects.get(beanName);从earlySingletonObjects缓存中获取bean对象(存放的半成品bean)
createBeanInstance执行内容
使用静态工厂、工厂方法或者容器的自动装配特性生成java实例对象
满足条件
this.doGetBean
(加载)通过DocumentLoader将载入的Bean定义资源转换成document对象 (DocumentLoader将Bean定义资源转换为Document对象:)
(解析)在完成通用的XML解析之后,按照Spring的Bean规则对Document对象进行解析。DefaultBeanDefinitionDocumentReader对Bean定义的Document对象解析:使用Spring的Bean规则解析Document元素节点 (实际上使用BeanDefinitionParserDelegate,用于完成真正的解析过程 )使用BeanDefinitionParserDelegate对Document对象中<Bean>元素的解析,获取到BeanDefinitionHolder(是对BeanDefinition的封装,即Bean定义的封装类)
beanInstance = this.doCreateBean
1.推断构造器
使用CGLIB来实例化对象
创建Bean实例(真正创建Bean的方法)
通过调用XML解析器将Bean定义资源文件转换得到Document对象,但是这些Document对象并没有按照Spring的Bean规则进行解析。
BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点
执行BeanFactoryPostProcessor的后置处理器(实例化beanFactory之后,bean实例化之前执行)span style=\"font-size: inherit;\
.如果存在单例对象工厂,则通过工厂创建一个单例对象 singletonObject = singletonFactory.getObject();
(子接口)BeanDefinitionRegistryPostProcessor
BeanPostProcessor 接口是 Spring 初始化 bean 时对外暴露的扩展点,Spring IoC 容器允许 BeanPostProcessor 在容器初始化 bean 的前后,添加自己的逻辑处理。在这边只是注册到 BeanFactory 中,具体调用是在 bean 初始化的时候。具体的:在所有 bean 实例化时,执行初始化方法前会调用所有 BeanPostProcessor 的 postProcessBeforeInitialization 方法,执行初始化方法后会调用所有 BeanPostProcessor 的 postProcessAfterInitialization 方法。
//从早期单例对象缓存中获取单例对象 singletonObject = this.earlySingletonObjects.get(beanName);
1.Object singletonInstance = this.getSingleton(beanName);从缓存中获取对象
使用容器的自动装配方法进行实例化
DefaultListableBeanFactory中使用一个HashMap的集合对象存放IoC容器中注册解析的BeanDefinition,向IoC容器注册。继而spring会把这个beanDefinition对象和生成的beanName放到一个map当中,key=beanName,value=beanDefinition对象;
(资源定位)首先,调用资源加载器的获取资源方法resourceLoader.getResource(location),获取到要加载的资源。(资源加载器获取要读入的资源:)
XmlBeanDefinitionReader解析载入的Bean定义资源文件:(根据DOM资源解析成bean)
实例化所有剩余(非懒加载)单例对象 beanFactory.preInstantiateSingletons();
通过beanName获取FactoryBean实例
Bean定义中没有方法覆盖
...............this.createBean
在完成通用的XML解析之后,按照Spring的Bean规则对Document对象进行解析。按照Spring的Bean规则对Document对象解析的过程是在接口BeanDefinitionDocumentReader的实现类DefaultBeanDefinitionDocumentReader中实现的。
是
将beanDefinition存入beanDefinitionMap,完成整个Bean的注册
得到封装BeanDefinition的BeanDefinitionHold对象,然后调用BeanDefinitionReaderUtils的registerBeanDefinition方法向IoC容器注册解析的Bean
使用读取器解析所有 Spring 配置文件,将所有 Spring 配置文件中的 bean 定义封装成 BeanDefinition,加载到 BeanFactory 中。加载到 BeanFactory 中” 的内容主要指的是添加到以下3个缓存:beanDefinitionNames缓存:所有被加载到 BeanFactory 中的 bean 的 beanName 集合。beanDefinitionMap缓存:所有被加载到 BeanFactory 中的 bean 的 beanName 和 BeanDefinition 映射。aliasMap缓存:所有被加载到 BeanFactory 中的 bean 的 beanName 和别名映射。创建一个新的 BeanFactory:DefaultListableBeanFactory。根据 web.xml 中 contextConfigLocation 配置的路径,读取 Spring 配置文件,验证配置文件的内容,并封装成 Resource。根据 Resource 加载 XML 配置文件,并解析成 Document 对象 。拿到 Document 中的根节点,遍历根节点和所有子节点
BeanFactoryPostProcessor 接口是 Spring 初始化 BeanFactory 时对外暴露的扩展点,Spring IoC 容器允许 BeanFactoryPostProcessor 在容器实例化任何 bean 之前读取 bean 的定义,并可以修改它。
将通过单例对象工厂创建的单例对象,放到早期单例对象缓存中 this.font color=\"#ff0000\
(父接口)BeanFactoryPostProcessor接口
this.getSingleton(beanName);执行内容
方法内容
遍历beanNames,触发所有SmartInitializingSingleton的后初始化回调
收藏
0 条评论
回复 删除
下一页