Spring启动的时候会进行扫描,会先调用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandid
ateComponents(String basePackage) 扫描某个包的路径,并得到BeanDefinition的Set集合。
MetadataReader表示类的元数据读取器。主要包含一个AnnotationMetadata。功能有
- 获取类的名字
- 获取父类的名字
- 获取所实现的所有接口名字
- 获取所有内部类的名字
- 判断是不是抽象类
- 判断是不是接口
- 判断是不是一个注解
- 获取拥有某个注解的方法集合
- 获取类上添加的所有注解信息
- 获取类上添加的所有注解类型集合
在Spring中,实例化对象之前,Spring提供了一个扩展点,允许用户来控制是否在某个或某些Bean实例化前做一些启动动作。这个扩展点叫InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation()。
根据BeanDefinition创建一个对象
Bean对象实例化出来之后,接下来就应该给对象的属性赋值。在真正给属性赋值之前,Spring又提供了一个扩展点MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition(),可以对此时的BeanDefinition进行加工。
在处理完BeanDefinition后,Spring又设计了一个扩展点InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation()。
完成了属性赋值后,Spring会执行一些回调。包括:
初始化前,Spring提供了一个扩展点:BeanPostProcessor.postProcessBeforeInitialization()。
查看当前Bean对象是否实现了InitializingBean接口,如果实现了就调用其afterPropertiesSet()方法
执行BeanDefinition中指定的初始化方法
Bean创建生命周期中的最后一个步骤,也是Spring提供的一个扩展点:BeanPostProcessor.postProcessAfterInitialization()