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
获取容器和bean
0.启动和扫描逻辑实现
整体逻辑:扫描bean,解析bean,将bean信息设置到BeanDefinition当中,放入beanDefinitionMap当中如果是单例bean创建后就放入单例池。调用getbean()方法时直接从单例池获取,原型bean的话就直接创建一个bean
整体流程图
启动类:首先,获取容器,通过构造方法传入配置类
配置类上的注解,通过注解获取要扫描的包,扫描包里面含有@conmonent注解的bean,将bean的信息放入BeanDefinition
扫描流程:扫描bean,解析bean,将bean信息设置到BeanDefinition当中,放入beanDefinitionMap当中。
如果是单例bean创建后就放入单例池。调用getbean()方法时直接从单例池获取,原型bean的话就直接创建一个bean
依赖注入
依赖注入的逻辑是判断bean上的字段是否存在@autowired注解,如果存在就获取bean并给属性注入。
Aware回调
回调主要是判断bean是否实现了BeanNameAware,BeanFactoryAware等各种接口,类似于按接口判断还有哪些属性需要注入。来实现对bean的扩展
初始化
初始化和之前Aware回调差不多,判断bean是否实现InitializingBean()接口,然后重写当中的afterPropertiesSet()方法。
初始化有三种方法
对于Spring Bean 的初始化归纳了下,主要可以归纳一下三种方式
@PostConstruct 标注方法
自定义初始化方法
实现 initializingBean 接口的afterPropertiesSet()方法
BeanPostProcessor
这个接口是后置处理器接口,可分为before,after。与前面的Aware也差不多。
AOP
AOP就是基于BeanPostProcessor实现,将代理bean放入单例池。