Spring源码学习笔记

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的过程中进行额外的处理。

  1. BeanFactoryPostProcessor: 对Bean定义信息进行后处理

    • BeanFactoryPostProcessor是在BeanFactory加载Bean定义信息后、实例化之前执行的回调接口。
    • 它允许我们修改或者扩展应用程序上下文中的BeanFactory的行为,并对Bean定义进行后处理。
    • 通过实现BeanFactoryPostProcessor接口,我们可以在Bean实例化之前对BeanDefinition进行修改、添加新的BeanDefinition,甚至动态地注册单例Bean。
  2. 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对象】,返回实例化对象)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值