Spring核心底层构造

因为最近研究Spring原理和练习原生手写Spring,许多类和类之间调用被搞混了,特此在此记录一下。如有错误还请更正,如有帮助欢迎转载

关键类和接口:

**
1.BeanFactory接口: 内嵌getBean方法,可通过类名和class获取相关bean。
2.BeanDefinition: 保存了bean实例创建名字和位置,包括是否单例和是否懒加载状态等 ,
3.BeanDefinitionReader : 负责加载和提供注册使用,将配置文件的类加载到集合中后,通过load方法全部遍历转化为BeanDefition.
4.DefaultListableBeanFactory类: 内部的beanDefinitionMap保存了注册信息的伪IOC容器,是ApplicationContext的父类接口。
5.BeanWrapper类: 是封装了提供DI要依赖注入的实体类,但因spring的设计方式,不会把最原始的对象放出去,会用一个BeanWrapper来进行一次包装。内部包含getWrappedInstance和getWrappedClass方法。

Spring Ioc

IOC学名叫控制反转,其实粗略理解就是利用了Spring(反射机制) 完成了自动创建对象等.ioc处理过程主要为三步,分别是定位,加载,注册。
 **ApplicationContext的构成**: 
 集成了GPDefaultListableBeanFactory类并实现了GPBeanFactory接口,它的构造方法就是将配置信息传入进来,给后续的Refresh(定位,加载,注册)方法提供了配置信息Refresh方法如下、![在这里插入图片描述](https://img-blog.csdnimg.cn/20210118124311240.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjI0MzgyOQ==,size_16,color_FFFFFF,t_70)

执行流程:
构造一个带有配置文件路径的构造方法applicationContext(配置文件路径) 从中调用refresh方法,执行一下流程:
定位:----------------------------
(1).创建BeanDefinitionReader(配置文件路径),内部调用DoScaner方法,扫描配置文件路径中所有的类将其加载到注册集合中,保存内容为全类名.
(2).
将里面的构造方法调用application.propertis的扫描包名,通过doScan方法扫描所有Spring中要进行反转的类和接口文件,进行递归遍历并且将类路径和类名全部收纳到注册类集合中以备后用.(集合内容如:com.vip.shop.User),在通过loadBeanDefinitions方法把注册类集合中类名全部转换为BeanDefinition形式保存,若果是保存的类BeanclassName则是SimpleClassName(如User),FactoryBeanClassName则是实际类路径(如:com.vip.shop.User),如果是接口形式则BeanClassName和FacotoryBeanClassName则是接口路径(例:com.vip.shop.Register-User实现的接口)和类路径(com.vip.shop.User).从而完成加载.

加载: -----------------------
调用BeanDefinitionReader的loadBeanDefition方法,将全类名的集合转换为BeanDefinition对象,包括实现的接口一并保存进List集合中.以备后续加载使用,当然这里的bean都默认为单例模式并和非延迟加载.
注册:
(1)遍历已经处理好的BeanDefinition集合,将其注入到DefaultListableBeanFactory里的Map<全类名, BeanDefinition> beanDefinitionMap 对象中。方便后续依赖注入使用。如有相同的类配置则会提示无法存入相同的类。

String Di

学名叫做依赖注入,可以理解为数据的自动化配置,主要分为对象的实例化和依赖注入两步
执行流程:
实例化:
(1)先将非懒加载的类进行依赖注入,通过Application的父类beanDefinitionMap集合中遍历,获取那些非延迟加载的bean,进行getBean操作,获取所有父级beanDefinitionMap的对象,将其遍历后通过反射机制实例化放入缓存的单例集合<类名,类实例>中以便后续在次调用直接从集合中获取,并返回当次创建的对象。此步开始已经进入DI的前半部分.实例化.再此之前会先进行

  • [ AOP相关] postProcessBeforeInitialization前置通知操作(有关AOP)

(2)在IOC结束后,需要对已经加载好的Bean进行注册,Spring做法是,不会把最原始的对象放出去,会用一个BeanWrapper来进行一次包装。构建好BeanWrapper后将其放入到IOC容器中<全类名,BeanWrapper>。并此时会进行一个 - [ AOP相关待学习] postProcessAfterInitialization后置通知操作

依赖注入:
(1) 进行注入会传入三种参数BeanName,新实例化的BeanDefanition对象,和构造好的BeanWrapper。
(2)根据传进来的beanName,和BeanWrapper和创建实例,来判断当前类是否是@Controller和@Service,包括参数是否是@Autowired,来判断是否需要依赖注入。
(3)通过反射机制得到类的所有参数,来通过AutoWired的默认值来进行强制访问进行赋值。达到对所有类的参数的默认值的赋值从而实现依赖注入.

Spring AOP

分为三步,创建代理对象,调用,通知–待完善

你可能感兴趣的:(Spring,spring)