在实例化bean之前会进行一系列的验证操作,大致流程如下。
- 容器启动
- 完成扫描
- 合格的类,生成beanDefinition放入beanDefinitionMap中
- 遍历循环beanDefinitionMap
- 解析验证
a. 是否单例
b. 是否抽象
c. 是否factoryBean(会走其他逻辑)
d. 是否已经创建
e. 是否懒加载
f. 等等 - 获取类class对象(在这一步处理之前,类的对象还未存入永久代或者元空间中,还只是字节码文件并没有真正被JVM读取,这一步处理之后,才算是获取了类的对象)
- 推断构造方法(推断该Bean的实例化创建方式,一个bean实例化的方式有多种,比如说静态工厂方法、实例工厂方法或者通过构造方法反射实例化对象),spring会在这一步选择一个合理的构造方法。
- 反射执行实例化对象(到这一步,单单只是对象被实例化出来了,里面的属性还未被填充)
- 如果当前这个对象有循环依赖,那么这里会提前构造出一个ObjectFactory对象工厂的对象,然后缓存起来
- 缓存依赖注入的对象,如果当前类有Autowired属性填充需要注入的话,这里就会把Autowired修饰的属性缓存起来,等到执行依赖注入的时候,再来处理这个属性。
- 判断是否需要完成属性注入(这里有一个程序员可扩展方法,可以指定忽略某个对象的注入)
- 完成属性注入
- 执行部分aware的回调(四个aware)
- 之前其他aware的回调,还会执行生命周期的回调(被添加@PostConstruct注解的方法)
- 执行生命周期的回调,(接口版afterPropertiesSet和XML版)
- 如果具备aop,在这一步完成代理
- 放入单例池中
如果简单来说,bean的生命周期就是不断的调用各种BeanPostProcessor,来实现bean的各种内容,比如前面讲过的AutowiredAnnotationBeanPostProcessor会处理@Autowired注解的属性。
那么16步中的aop就是对生命周期的一种扩展,原本是没有这个代理的,后来扩展了BeanPostProcessor的实现类,让bean在生命周期中执行了扩展方法,才实现了aop的动态代理。
下一章我们来模拟扩展aop