从源码分析 spring 如何实现注解的配置方式
前言
在 spring-boot 的启动过程中,会根据 classpath 中的类来创建对应的 AnnotationConfigApplicationContext, AnnotationConfigReactiveWebServerApplicationContext 或 AnnotationConfigServletWebServerApplicationContext 作为 application context。
这几个类都有成员 AnnotatedBeanDefinitionReader reader 和 ClassPathBeanDefinitionScanner scanner。
- AnnotatedBeanDefinitionReader 是解析 @Configuration 注解的关键,, ConfigurationClassPostProcessor 将会在 application context refresh 的过程中扫描 @Configuration, 并从中找到 bean 配置, 注册到 beanFactory。
- ClassPathBeanDefinitionScanner 扫描指定的类路径,找出其中 @Service, @Component (@Configuration 也是一种 @Component) 等注解修饰的类,并注册到 beanFactory。
@Configuration 解析
@Configuration 由 ConfigurationClassPostProcessor 处理。
AnnotatedBeanDefinitionReader 在它的构造方法中会将 ConfigurationClassPostProcessor 这个 BFPP 注册到 beanFactory。ConfigurationClassPostProcessor 实现了 BeanDefinitionRegistryPostProcessor,会在 application context refresh 的过程中扫描 @Configuration, 并从中找到 bean 配置, 注册到 beanFactory。
1 | public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { |
processConfigBeanDefinitions 方法的过程如下
1 | // 解析 @Configuration 并注册 bean |