Spring @Import 注解全流程
2021-06-07 09:42:28 0 举报
SpringBooot 中 @Import 注解的处理流程,该部分为自动配置的核心
作者其他创作
大纲/内容
44. invocation.proceed()
12. PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors()
初始化普通 bean 时后置处理器搜索候选切面,根据切入点匹配切面和目标bean,应用切面创建代理对象
45. 调用 AnnotationAsyncExecutionInterceptor 的父类 AsyncExecutionInterceptor 的实现
37. processor.postProcessAfterInitialization()
AnnotationAsyncExecutionInterceptor
以JdkDynamicAopProxy#getProxy() 为例
步骤 28 中如果在当前 Context 未找到目标 bean 的定义,且其有父 Context,则通过父Context的 Bean 工厂获取目标 bean
44. 从头部开始执行拦截链上的拦截处理器,递归进行
15. processConfigBeanDefinitions()
AsyncAnnotationAdvisor
ConfigurationClassPostProcessor
19.2 配置类被解析,则其中@Bean配置的类 AsyncAnnotationBeanPostProcessor 也将被导入
canApply()
refreshContext 开始创建 bean ,通过ConfigurationClassParser 解析配置类
17. processConfigurationClass()
39. AopUtils.canApply()
38. isEligible()
步骤 30 创建 bean 分为两步,首先实例化 bean 对象,其次填充成员变量,初始化 bean
AbstractAutowireCapableBeanFactory
18. doProcessConfigurationClass()
9. refreshContext()
36. 获取 bean 基本流程与优先初始化BeanPostProcessor相同,但有后置处理器的调用
19.1 getImports()
prepareContext 注册ConfigurationClassPostProcessor
JdkDynamicAopProxy
31. invokeAwareMethods()
服务启动
AbstractAdvisingBeanPostProcessor
步骤 22 将 @Bean 标注的方法要构造的对象的 bean 定义注册到容器中步骤 23 直接回调 ImportBeanDefinitionRegistrar#registerBeanDefinitions() 方法将指定 bean 定义注册到容器中
AnnotationMethodMatcher
22. loadBeanDefinitionsForBeanMethod()
invoke()
29. 子类实现 createBean()
10. refresh()
步骤 27 优先初始化实现了 BeanPostProcessor 接口的类
32. ((BeanFactoryAware) bean).setBeanFactory()
19.1 selector.selectImports()
ImportBeanDefinitionRegistrar
AsyncConfigurationSelector
30.1 createBeanInstance()
1. run()
ProxyAsyncConfiguration
BeanDefinitionLoader
ConfigurationClassBeanDefinitionReader
优先初始化 BeanPostProcessor 后置处理器
SpringApplication
将处理 @Configuration 标注的配置类的 PostProcessor 注册到容器中
Proxy.newProxyInstance() 使用 JDK 的实现创建代理类,同时指定代理的 Handler 为 JdkDynamicAopProxy 自身
34.2 buildPointcut()
19. getImports() 收集所有 @Import 注解配置的类,processImports() 方法解析其导入的类,此处分 3 个场景:1. 导入的类为 ImportSelector,则调用 ImportSelector#selectImports() 方法获取其选择导入的类,递归调用 processImports()2. 导入的类为ImportBeanDefinitionRegistrar,则将其直接添加到 Map 缓存3. 其他情况将导入的类作为 @Configuration 标注的类处理,调用 processConfigurationClass() 方法,继续处理经过递归,配置类中 @Bean 标注的方法都会被缓存在 Map 中
6. new AnnotatedBeanDefinitionReader()
AopUtils
4. createBeanDefinitionLoader()
AnnotationConfigUtils
40. methodMatcher.matches()
2. prepareContext()
ProxyFactory
43.new ReflectiveMethodInvocation()
33. new AsyncAnnotationAdvisor()
ConfigurationClassBeanDefinitionReader 将配置的 bean 注册到容器,包括切面等
36. applyBeanPostProcessorsAfterInitialization()
16. parser.parse()
41. proxyFactory.getProxy()
28. doGetBean()
25. registerBeanPostProcessors()
AsyncAnnotationBeanPostProcessor
30.2 initializeBean()
7. AnnotationConfigUtils.registerAnnotationConfigProcessors()
new AnnotationAsyncExecutionInterceptor()
AnnotationMatchingPointcut
父类实现
ConfigurationClassParser
AbstractBeanFactory
3. load()
42. 外部调用目标方法
8. registerPostProcessor()
21. loadBeanDefinitionsForConfigurationClass()
30. doCreateBean()
14. postProcessor.postProcessBeanFactory()
AnnotationMethodMatcher 保存 @Async 注解作为匹配的目标锚点
19.2 processImports()
24. registerBeanDefinitions()
27. beanFactory.getBean()
ReflectiveMethodInvocation
AnnotatedBeanDefinitionReader
19.2 调用父类 selectImports() 方法,将配置类 ProxyAsyncConfiguration 导入
12.1 beanFactory.getBean()
13. invokeBeanFactoryPostProcessors()
26. PostProcessorRegistrationDelegate.registerBeanPostProcessors()
34.1 buildAdvice()
11. invokeBeanFactoryPostProcessors()
35. getBean() 获取@Async异步任务目标 bean对象
@EnableAsync
5. new BeanDefinitionLoader()
此处逻辑为判断目标方法上是否有 @Async 注解
23. loadBeanDefinitionsFromRegistrars()
AbstractApplicationContext
20. reader.loadBeanDefinitions()
@Import(AsyncConfigurationSelector.class)
PostProcessorRegistrationDelegate
45. invoke()
0 条评论
下一页