BeanFactory:访问IOC容器的根接口 ____________________________________________________________________________________ SpringBootApplicationContext.prepareContext:BeanDefinitionReader对象的载入和DefaultListableBeanFactory 工厂的创建,注意:创建在此处进行,refresh处只是获取。
ConfigurableEnvironment是Spring Boot中的一个接口,它代表了应用程序的可配置环境。它提供了一种获取属性值的途径,以供应用程序在运行时使用。:如配置文件信息的获取
——————————————————————————————————————————
程序入口 :
AbstarctApplicationContext.refresh()
刷新应用程序上下文,启动初始化过程,并完成所有的bean的初始化。该方法会在应用程序上下文的初始化过程中被Spring框架自动调用。
首先获取,后续操作基于,DefaultListableBeanFactory
AOP应用场景:
1.事务管理
2.日志
3权限控制
拓展点:
BeanDefinitionReader:
Bean定义信息的读取,读取Bean定义信息
———————————————————————————————————————————
两个接口的区别:
BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor是Spring Framework中的两个扩展点,用于在容器实例化和配置Bean的过程中进行额外的处理。
-
BeanFactoryPostProcessor: 对Bean定义信息进行后处理
- BeanFactoryPostProcessor是在BeanFactory加载Bean定义信息后、实例化之前执行的回调接口。
- 它允许我们修改或者扩展应用程序上下文中的BeanFactory的行为,并对Bean定义进行后处理。
- 通过实现BeanFactoryPostProcessor接口,我们可以在Bean实例化之前对BeanDefinition进行修改、添加新的BeanDefinition,甚至动态地注册单例Bean。
-
BeanDefinitionRegistryPostProcessor:
- BeanDefinitionRegistryPostProcessor扩展了BeanFactoryPostProcessor接口,是BeanFactoryPostProcessor的子接口。
- 它在BeanFactory加载BeanDefinition后、实例化之前执行,在BeanDefinition被完全加载到BeanFactory之前提供了一个扩展点。
- BeanDefinitionRegistryPostProcessor可以用于进一步定制BeanFactory,如注册更多的自定义BeanDefinition、添加BeanDefinition的元数据信息等。
- 与BeanFactoryPostProcessor不同的是,BeanDefinitionRegistryPostProcessor还可以直接操作BeanDefinitionRegistry,即BeanFactory的底层接口,而不仅限于对BeanDefinition的处理。
——————————————————————————————————————————
———————————————————————————————————————————
Spring中有哪些拓展点
BeanFactoryPostProcessor:对容器内的对象进行修改(后置处理器、增强器)
———————————————————————————————————————————
IOC容器内部封装了一系列Map结构
BeanDefinition:接口,包含了bean的定义信息
ApplicationContext,与BeanFactory相比,提供了更强大的功能
总分结构回答,突出关键接口、类、方法名
run -> AbstractApplicationContext.refresh()程序的入口
在IOC中的操作都是基于DefaultListableBeanFactory
bd对象保存在map集合中
———————————————————————————————————————————
容器Bean:
1.BeanFactory
2.ApplicationContext
检查Aware相关接口并设置相关依赖原因
——————————————————————————————-————————————
refresh方法宝包括了整个Spring的执行流程和bean的完整生命周期
某些情况下实例化bean的过程比较复杂,可以实现BeanFactory接口定制bean的实例化逻辑
Spring是如何检测是否存在循环依赖的:
使用列表来记录正在创建中的bean,bean创建之前,先去记录中看一下是否在列表中,如果在说明存在循环依赖,如果不在,则将其加入到这个列表,bean创建完毕之后,将其再从列表中移除
———————————————————————————————————————————
工厂模式的使用:
代理对象的生成是从代理工厂中获取的
aop的入口是在BeanFactoryPostProcessor(里面有一个前置增强方法,还有后置增强方法),aop对象的创建是在后置增强中进行的(可以选择)
———————————————————————————————————————————
问题1:谈谈对SpringIoc的理解
ioc aop 容器 生态 基石
aop:与业务无关的代码可以通过aop实现
名词及注意:
循环依赖得以解决的根本愿意:Spring中bean的实例化和初始化是分开执行的
RuntimeBeanReference
三级缓存访问顺序:一级-》二级-》三级
objectFactories中保存的是lambda,当调用getObeject时,才会真正执行代码
优点:类似于回调机制,可以选择暴露
三级缓存放前提:
判断是否允许提前暴露 (单例bean、bean正在创建过程中、允许循环引用)
——————————————————————————————————————————
BeanFacoty:访问ioc容器的根接口
IOC Inversion of Controller(控制反转):关键点:谁控制谁?控制了什么? ioc不是一种技术,而是一种思想,在程序中主动控制对象的创建转为接受容器为调用者的成员进行赋值。
Spring提供了一个IOC容器对这种思想进行了落地实现,使用map结构来进行对象存储,ioc容器中通常存在三级缓存,使用singletonObjects保存成品对象,earlierSingletonObjects保存的是半成品对象,singletonFactories保存的是创建对象的工厂,bean对象的生命周期是IOC容器所管理的
BeanFactory,表示SpringIOC容器,实现类为DefaultListableBeanFactory【bean实例化和获取的具体类】
在IOC流程中,先是获取了一个BeanFactory的实现类DefaultListableBeanFactory(后续的操作都是基于此实例进行的),调用prepareFactory方法做了一些准备工作,各种(属性填充)bd对象在此载入(来源@ComponentScan @Import @Configuration xml ),生成相应的bd对象,。【在invokeBeanFactoryPostProcessors 前bd对象就存在,不过不是完整的bd对象,
bd对象的注册(也就是配置文件的读取是在实例化ApplicaitonContext过程中就完成的,在refresh方法前就完成了)
xml的注册 xml - 》dom4j(xml解析api) -> document ->nodeList
注解:获取要扫描的类,判断类上是否存在注解
BeanFactoryPostProcessors是Spring的一个拓展点,(二次开发使用较多)】对BeanFactory提供了额外的拓展操作,如:字符串的替换
finishBeanFactoryInitialization中完成bean对象的创建和初始化工作
方法调用过程:getBean -》doGetBean -》createBean -> doCreateBean -populateBean
流程:获取所有的beanName(注意不是从bd对象中获取)
以A中依赖bean,B中依赖A为例,总共需要执行两次该过程 1.从三级缓存中查找是否存在bean,不存在根据beanName获取bd对象,根据bd对象判断是否是单例bena,分支-》单列bean和原型bean创建
创建bean:
createBeanInstance:创建bean实例
允许提前暴露,则将创建bean的factory添加到三级缓存中
populateBean bean属性的填充
population中进行:获取要注入属性的RuntimeBeanReference,进行解析,getBean
先实例化A
此时三级缓存中已经有对象A和对象B
第三遍getBean(当查看三级缓存中存在对象A时【将A对象存入二级缓存中,并删除三级缓存中对的A对象】,返回实例化对象)