文章目录
准备工作
- 使用的是Spring5.0的源码
- 准备一个BeanTest的测试类
启动Spring
- refresh()方法是Spring的启动方法,我们启动它
refresh()
- BeanPostProcessor会在registerBeanPostProcessors(beanFactory)注册到工厂中去
- 我们主要看finishBeanFactoryInitialization(beanFactory)方法,这个方法是用来实例化非懒加载的Bean
finishBeanFactoryInitialization(beanFactory)
- 下边这个方法是真正开始实例化Bean
preInstantiateSingletons()
- 这个方法就是首先将所有的BeanName放入集合,然后遍历通过getBean(beanName)这个方法来获取Bean,因为我的BeanTest不是FactoryBean所以走下边的getBean(beanName)
- 进入getBean后是一个doGetBean方法然后再点进去
- 代码太多就直接找到关键方法吧,就是调用getSingleton()然后传入了beanName和一个Lambda表达式,我们进去看这个getSingleton()方法
- 加锁然后在单例池中再次get,防止被创建过,如果没有则进入创建流程通过getObject()调用Lambda表达式开始创建对象,然后上个方法进入createBean(beanName, mbd, args)
createBean(beanName, mbd, args)
- 首先找到这个方法,这是第一次调用BeanPostProcessor