一、Spring启动流程分析:
1.spring容器启动时会调用所有BeanFactoryPostProfessor的postProcessBeanFactory()方法,首先调用所有BeanDefinitionRegistryPostProcessor类型的(AnnotationConfigApplicationContext启动时会向容器中添加ConfigurationClassPostprocessor,该类实现了BeanDefinitionRegistryPostProcessor):
看下ConfigurationClassPostProfessor 执行过程:
1)通过 parser.parse(candidates)
解析配置类上的所有注解
2)当解析到@Import注解时,会对Import中的类做判断,有三种情况:
- 普通类
- ImportSeletor
- ImportBeanDefinitionRefistrar
对ImportBeanDefinitionRefistrar的处理如下:
将其放到了ConfigurationClass的importBeanDefinitionRegistrars中:
而该ConfigurationClass会被添加到parser的configurationClasses中:
3)解析完所有注解后,会遍历所有ConfigrationClasses的importBeanDefinitionRegistrars,执行registerBeanDefinitions()方法。
2.调用完所有BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProfessor之后,调用实现了BeanDefintionRegistryPostProcessor & PriortiyOrdered接口的实现类;
3.调用实现了BeanDefintionRegistryPostProcessor & Ordered接口的实现类 ;
4.最后会再调用一遍所有的BeanDefinitionRegistryPostProcessor类型的BeanFactoryPostProfessor(执行完ConfigurationClassPostProcessor后新注入进容器中的):
二、@MapperScan处理
1.@MapperScan注解:
当ConfigurationClassPostProcess解析到加了@MapperScan注解的配置类之后,获取到MapperScannerRegistrar,而MapperScannerRegistrar实现了ImportBeanDefinitionRegistrar,因此会调用其registerBeanDefinitions()方法:
该方法会向容器中添加MapperScannerConfigurer,该类信息如下:
2.MapperScannerConfigurer:
该类实现了BeanDefinitionRegistryPostProcess接口,因此在invokeBeanFactoryPostProcessors()的最后一步会调用MapperScannerConfigurer的postProcessBeanDefinitionRegistry(),方法信息如下:
scanner的 scan()方法就会扫描我们在@MapperScan中配置的路径下的所有mapper接口,scan()方法详解放到下一篇来说。