Spring最重要的功能就是帮助程序员创建对象(也就是IOC)
在Spring中,一个Bean是如何生成的,如何销毁的
Bean的生成过程
生成BeanDefinition
Spring启动的时候会进行扫描,会先调用org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#scanCandidateComponents(String basePackage)
扫描某个包路径,并得到BeanDefinition的Set集合。
Spring扫描流程
//org.springframework.context.annotation.ClassPathBeanDefinitionScanner#doScan
// DefaultListableBeanFactory
//生成beanName org.springframework.context.annotation.AnnotationBeanNameGenerator#generateBeanName
//默认值赋值 postProcessBeanDefinition
//解析属性注解赋值 AnnotationConfigUtils.processCommonDefinitionAnnotations
//BeanDefinition 包装成 BeanDefinitionHolder
//把BeanDefinitionHolder 注册到 beanDefinitionMap
//org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider#findCandidateComponents
//生成非懒加载的单例bean
//org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
//org.springframework.beans.factory.config.ConfigurableListableBeanFactory#preInstantiateSingletons
//通过 beanName 查找 RootBeanDefinition
//mergedBeanDefinitions
//org.springframework.beans.factory.support.AbstractBeanFactory#getMergedBeanDefinition
//创建完所有的单例bean后,调用每个单例bean的SmartInitializingSingleton.afterSingletonsInstantiated
- 通过ResourcePatternResolver获得指定包路径下的所有
.class
文件(Spring源码中将此文件包装成了Resource对象- 可以指定配置文件,仅扫描配置文件里的对象
- 遍历每个Resource对象
- 利用MetadataReaderFactory解析Resource对象得到MetadataReader
- 利用MetadataReader进行excludeFilters和includeFilters,以及条件注解@Conditional的筛选
- 筛选通过后,基于metadataReader生成ScannedGenericBeanDefinition
- 基于metadataReader判断是不是对应的类是不是接口或抽象类
- 将ScannedGenericBeanDefinition加入结果集