4、筛选出实现:BeanFactoryPostProcessor、PriorityOrdered 接口的Bean工厂的后置处理器(包含1)
1、若我们的bean实现了XXXAware接口,进行相应的方法回调
BeanPostProcess
最终得到创建好的Bena,有事务或AOP的话也已经创建动态代理
ClassPathBeanDefinitionScanner Set<BeanDefinition> candidates = findCandidateComponents(basePackage);
2、调用BenPostProcessorpost的postProcessBeforeInitialization方法的
遍历 metadataReader
return 创建的对象
3、筛选出实现:BeanDefinitionRegistryPostProcessor、没有实现实现Ordered 接口的Bean工厂的后置处理器
扩展点
scanner.doScan(StringUtils.toStringArray(basePackages));
创建具体的扫描器,不适用AnnotationConfigurationContext构造初始扫描器
ConfigurationClassPostProcessor
bean != null,后置处理器返回自定义创建的实例
AbstractAutowireCapableBeanFactory.createBean
1、如果当前创建BeanA是普通Bean,没有涉及AOP,那么直接直接拿到创建的对象返回即可,返回后会加入一级缓存,删除三级缓存2、如果创建的BeanA是普通Bean,涉及AOP,那么在初始化的时候创建AOP动态代理对象,后会加入一级缓存,删除三级缓存2、如果是循环依赖,A(涉及aop)、B相互依赖:A先创建,放入三级缓存,属性赋值时getBean(B)-> 实例化B,属性赋值,getBean(A),A是正在创建的,所以getSingleton(A)直接在三级缓存中获取到,调用函数接口创建A的动态代理放入二级缓存,并返回A的动态代理给B的引用。B创建完成,赋值给A的属性,A属性赋值完成,然后也是getSingleton(A)从二级缓存中获取到A本身的动态代理。直接返回A的动态代理,然后放入一级缓存,清空二三级缓存。
第一次执行BeanPostProcessor
Object beanInstance = doCreateBean()
6、解析@Bean
3、解析 ComponentScan、ComponentScans 解析到BeanDefinition直接加入BeanDefinitionMao,其他都是扫描后暂存,统一就加入
缓存中获取不到
判断是否是工厂Bean,& + beanName 是直接获取工厂Bean的原实例,如果是工厂Bean,但是BeanName 没有 & 就是调用工厂Bean的getObject()方法获取动态代理对象,回去完动态代理之后还需要判断是否有被Advisor命中,命中的还是需要创建动态代理
AbstractBeanFactorydoGetBean(name)
//1、第一次去缓存中取(尚未标识正在创建,所以只查一级换存)Object sharedInstance = getSingleton(beanName);
属性填充
2、解析@PropertySource
getBean()
//将事件监听器注册到事件多播器上registerListeners();
&beanName
BeanDefinitionRegistryPostProcessor extends BeanFactoryPostProcessor所以:BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor是Spring 在加载BeanDefinition阶段的两个扩展点
//注册BeanPostProcess:从上一步的扫描出来的BeanDefinition 中找出所有的 BeanPostProcessor ,getBean()实例化,并注册到 DefaultListableBeanFactory registerBeanPostProcessors(beanFactory);
internalConfigurationAnnotationProcessor
1、Configuration 完全配置类2、Component、ComponentScan、Import、ImportResource 非完全配置类
1、获取 BeanDefinitionRegistry (即 AnnotatonConfigurationApplicationContext)已经注册的所有的 BeanDefinition ,刚开始只有创世纪的5个类和自己指定MainConfig 配置类
//遍历所有的BeanPostProcess,筛选出 InstantiationAwareBeanPostProcessor 接口span style=\"font-size: inherit;\
初始化
BeanFacory
4、解析@Import
1、解析Component
如果存在循环依赖
DefaultListableBeanFactory.preInstantiateSingletons();
factoryBeanInstanceCache 是容器初始化时已经将所有的相关工厂Bean缓存起来,工厂 bean会从 factoryBeanInstanceCache 中获取
是否是配置类
同一个注解扫描出来的相同的BeanName直接抛出异常,不同的注解用相同的名字后者覆盖前者
//判断扫描的类是否符合要求,不能是接口、抽象类等,mybatis需要将mapper接口纳入创建动他代理就需要重写该方法isCandidateComponent(sbd)
如果有AOP则创建动态代理,否者返回原实例
//将calss文件转化为 BeanDefinitioninvokeBeanFactoryPostProcessors(beanFactory);
具体执行
校验
getEarlyBeanReference
执行 DefaultListableBeanFactory Bean工厂的实现类
bean = null
ClassLoader
回调函数接口,执行真正的创建过程
ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry()
//怕毛短是否是候选组件,判断includeFilters、excludeFiltersisCandidateComponent(metadataReader)
设置扫描器的includeFilters、excludeFilters属性
5、筛选出实现:BeanFactoryPostProcessor、Ordered 接口的Bean工厂的后置处理器(包含2)
synchronized (this.singletonObjects)加锁,保证对象的创建是单线程的
getBean(beanName);
解析出来的是配置类,回调parse方法,再次解析
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner()
isFactoryBean 判断是否是工厂Bena,如果是先执行1、getBean(&+beanName)创建原实例,放入一级缓存(如果原生实例从factoryBenaInstance缓存中获取实例对象,不需要newInstance,dandan是还是需要走属性赋值、初始化的步骤)。2、然后才会调用getBean(beanName),这次可以从一级缓存里面获取原实例,然后才会调用原实例的getObject()方法
2、FactorBean自定义创建
singletonObject = singletonFactory.getObject();
BeanDefinitionBeanDefinitionMap
PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors
postProcessBeanFactory
sharedInstance != null
1
//遍历解析到的BeanDefinitionBeanDefinition candidate : candidates
1、反射实例化
按照优先顺序调用BeanFactoryPostProcess方法
最终将BeanDefinition放入this.beanDefinitionMap
2、筛选出实现:BeanDefinitionRegistryPostProcessor、Ordered 接口的Bean工厂的后置处理器
创建出来的早期对象,放入三级缓存
DefaultSingletonBeanRegistrygetSingleton()
ConfigurationClassPostProcessor.finishBeanFactoryInitialization(beanFactory);
属性赋值
//AbstractAutoProxyCreator调用SmartInstantiationAwareBeanPostProcessor后置处理器
BeanDefinitionRegisterPostProcessor尚未加载进BeanFactory,可以修改、添加、删除
instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
添加到一级缓存,移除二三级缓存
3、初始化
//再次从一级缓存中尝试获取Object singletonObject = this.singletonObjects.get(beanName);
singletonFactory
4、解析配置类 new ConfigurationClassParser()parser.parse(candidates);candidates = mainConfig(自定义的配置类)
1、遍历BeanDefinitionMap
instanceWrapper = null,不是 FactoryBean
一次加锁两次判断
XmlConfigApplication
BeanFactoryPostProcessor已经加载将进BeanFactory,只能修改
2、
扫描出指定包路径下的所有Class文件-metadataReader
//判断当前Bean是否实现InitializingBean接口bean instanceof InitializingBean
AnnotationConfigApplication
xml
mybatis 整合 spring ,已经确定mapper接口的文件,只需要继承 ComponentScanAnnotationParser extends ClassPathScanningCandidateComponentProvider ,重写 isCandidateComponent 方法,调用 doScan 方法即可导入mapper接口的BeanDefinition(FactoryBean - Jdk动态代理)那在mybatis中的使用,只需要在创建BeanDefinitionRegisterPostProcessor Bean工厂的后置处理器厂创建使用即可。
this.reader.loadBeanDefinitions(configClasses);统一加载进入BeanDefinitionMap
Annotation
//标记当前对象正在创建this.singletonsCurrentlyInCreation.add(beanName)
2、判断是否是FactoryBeanisFactoryBean(beanName)
一级缓存中获取到
1、筛选出实现:BeanDefinitionRegistryPostProcessor、PriorityOrdered 接口的Bean工厂的后置处理器
5、解析@ImportResource
//实例化我们剩余的单例BeanfinishBeanFactoryInitialization(beanFactory);
3、不是Factory
4、调用BeanPostProcessor的postProcessAfterInitialization
AnnotationConfigApplicationContext
//创建事件多播放器initApplicationEventMulticaster();
refresh();
postProcessBeanDefinitionRegistry
//根据配置文件执行扫描包路径去扫描Set<BeanDefinitionHolder> scannedBeanDefinitions = this.componentScanParser.parse();
//满足组件条件candidates.add(sbd);
ComponentScanAnnotationParser.parse()
6、筛选出实现:BeanFactoryPostProcessor、没有实现实现Ordered 接口的Bean工厂的后置处理器(包含3)
执行接口属性赋值方法
JVM类加载机制加载加载进元空间
遍历扫描出来的 scannedBeanDefinitions
AbstractAutowireCapableBeanFactoryinitializeBean
getBean(beanName)
在ConfigurationClassPostProcessor的时机
2、遍历所有的 candidateNames (BeanDefinition),判断是否是配置类 (1、完全配置了类@Configuration - 用 FULL 标识2、非完全配置类:Component、ComponentScanner、ImportResources、Import),
((InitializingBean) bean).afterPropertiesSet();
函数接口getEarlyBeanReference,只会在getSingleton中才会调用