1 | public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) { |
AnnotationConfigApplicationContext初始化
AnnotationConfigApplicationContext(Class<?>... annotatedClasses)
调用AnnotationConfigApplicationContext的空构造函数AnnotationConfigApplicationContext()
进行初始化
1 | public AnnotationConfigApplicationContext() { |
AnnotatedBeanDefinitionReader
AnnotatedBeanDefinitionReader构造函数:
1 | public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) { |
AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry)
中调用DefaultListableBeanFactory.registerBeanDefinition
来注册各种BeanPostProcessor的BeanDefinition,包括:
- ConfigurationClassPostProcessor
- AutowireAnnotationBeanPostProcessor
- RequireAnnotationBeanPostProcessor
- CommonAnnotationBeanPostProcessor
- EventListenerMethodProcessor
- DefaultEventListenerFactory
ClassPathBeanDefinitionScanner
ClassPathBeanDefinitionScanner构造函数:
1 | public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry, boolean useDefaultFilters, Environment environment, ResourceLoader resourceLoader) { |
注册初始配置文件
注册初始配置文件使用了AnnotationConfigApplicationContext构造函数中初始化的AnnotatedBeanDefinitionReader。调用reader.register方法,最终调用的是AnnotationConfigApplicationContext.registerBean(Class<?> annotatedClass, String name, Class<? extends Annotation>... qualifiers)
,主要步骤如下:
先将Class包装成AnnotatedGenericBeanDefinition
AnnotatedGenericBeanDefinition abd = AnnotatedGenericBeanDefinition(annotatedClass)
其中,metadata为StandardAnnotationMetadata,里面的annotations保存了配置类中的注释(比如:Configuration, ComponentScan等)
调用
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd)
,处理常见的注释判断配置文件是否有一下几个注释,分别进行处理:
- Lazy
- Primary
- DependsOn
- Role
- Description
再将AnnotatedGenericBeanDefinition包装成BeanDefinitionHolder
BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName)
调用
AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry)
最后注册BeanDefinition
BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry)
注册BeanDefinition
注册BeanDefinition调用的是DefaultListableBeanFactory.registerBeanDefinition
,该方法在后面的启动过程中还会经常使用。主要的功能是将bean的名称(beanName)和bean的定义(beanDefinition)放入beanDefinitionMap中,将beanName放入beanDefinitionNames中:
1 | this.beanDefinitionMap.put(beanName, beanDefinition) |
Spring启动主流程
注册完初始的配置文件之后,开始执行主流程。主流程全部包含在AbstractApplicationContext.refresh
函数中
1 | public void refresh() throws BeansException, IllegalStateException { |