手写简易Spring框架

b站图灵学院up周瑜手写简易Spring课程笔记
Spring系列文章 (yuque.com)
相关视频:2022吃透这些Java手写(Spring、Tomcat、Dubbo、JVM、Hashmap、Mybatis、Springmvc)框架源码,看完吊打面试官!_哔哩哔哩_bilibili
视频配套代码https://gitee.com/archguide/zhouyu-spring.git

总览

手写spring课程大概分为以下几步

手写Spring启动以及扫描流程
手写getBean()流程
手写Bean生命周期流程
手写依赖注入流程
手写BeanPostProcessor
机制手写Aop机制

bean的生命周期简易流程图

UserService.class —> 无参构造方法 —>普通对象—>依赖注入(属性赋值、BeanNameAware接口、BeanClassLoaderAware接口、BeanFactoryAware接口)—>初始化前(postconstruct)—>初始化(initializingBean)—>初始化后(aop)—>代理对象—>Bean
手写简易Spring框架_第1张图片

获取容器和bean

在这里插入图片描述
手写简易Spring框架_第2张图片

0.启动和扫描逻辑实现

整体逻辑:扫描bean,解析bean,将bean信息设置到BeanDefinition当中,放入beanDefinitionMap当中如果是单例bean创建后就放入单例池。调用getbean()方法时直接从单例池获取,原型bean的话就直接创建一个bean

整体流程图

手写简易Spring框架_第3张图片

启动类:首先,获取容器,通过构造方法传入配置类

手写简易Spring框架_第4张图片

配置类上的注解,通过注解获取要扫描的包,扫描包里面含有@conmonent注解的bean,将bean的信息放入BeanDefinition

手写简易Spring框架_第5张图片
手写简易Spring框架_第6张图片

扫描流程:扫描bean,解析bean,将bean信息设置到BeanDefinition当中,放入beanDefinitionMap当中。

手写简易Spring框架_第7张图片

如果是单例bean创建后就放入单例池。调用getbean()方法时直接从单例池获取,原型bean的话就直接创建一个bean

手写简易Spring框架_第8张图片

依赖注入

依赖注入的逻辑是判断bean上的字段是否存在@autowired注解,如果存在就获取bean并给属性注入。

Aware回调

回调主要是判断bean是否实现了BeanNameAware,BeanFactoryAware等各种接口,类似于按接口判断还有哪些属性需要注入。来实现对bean的扩展
手写简易Spring框架_第9张图片

初始化

初始化和之前Aware回调差不多,判断bean是否实现InitializingBean()接口,然后重写当中的afterPropertiesSet()方法。
初始化有三种方法

对于Spring Bean 的初始化归纳了下,主要可以归纳一下三种方式
@PostConstruct 标注方法
自定义初始化方法
实现 initializingBean 接口的afterPropertiesSet()方法

BeanPostProcessor

这个接口是后置处理器接口,可分为before,after。与前面的Aware也差不多。
手写简易Spring框架_第10张图片

AOP

AOP就是基于BeanPostProcessor实现,将代理bean放入单例池。

你可能感兴趣的:(springboot基础知识,spring,java)