Spring容器启动准备流程图
2023-02-14 17:07:59 0 举报
Spring启动过程详细源码流程图
作者其他创作
大纲/内容
propertyEditor类型转换器注册器,注册默认的propertyEditoraddPropertyEditorRegistrar
存在未执行过的BeanFactoryProcessor!processedBeans.contains(ppName)
配置类解析parser.parse(candidates);
candidates.clear();
注册传入的配置类register(componentClasses);
实现了PriorityOrdered接口,用来解析配置类的BeanFactoryPostprocessornew RootBeanDefinition(ConfigurationClassPostProcessor.class)
包扫描器this.scanner = new ClassPathBeanDefinitionScanner(this);
解析配置类parser.parse(candidates);
准备:记录启动时间、允许子容器设置一些内容到Environment中、验证Environment中是否包含了必须的属性prepareRefresh()
byType进行依赖注入时, 先从这个属性中根据类型找beanregisterResolvableDependency
prepare
用来判断某个Bean是不是实现了LoadTimeWeaverAware接口,如果是执行它的回调方法addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory))
processConfigBeanDefinitions(registry);
当前的beanDefinition不能是这些类型BeanFactoryPostProcessor、BeanPostProcessor、AopInfrastructureBean、EventListenerFactory
拿到Spring中的现阶段所有的BeanDefinitionString[] candidateNames = registry.getBeanDefinitionNames();
BeanPostProcessor用来处理@Autowired注解和@Value注解new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class)
while (reiterate)
设置表达式解析器,解析Spring中的表达式setBeanExpressionResolver
candidateIndicators.add(Component.class.getName()); candidateIndicators.add(ComponentScan.class.getName()); candidateIndicators.add(Import.class.getName()); candidateIndicators.add(ImportResource.class.getName());
刷新容器refresh();
初始化条件上下文,往reader中放入BeanFactory、environment、classLoaderthis.conditionEvaluator = new ConditionEvaluator()
font color=\"#323232\
其他beanFactoryPostProcessor放入另一个listregularPostProcessors.add(postProcessor);
从Spring中获取并创建BeanDefinitionRegistryPostProcessor类型且继承了PriorityOrdered接口的BeanFactoryProcessor
默认的一个时间监听者工厂new RootBeanDefinition(DefaultEventListenerFactory.class)
解析某个Bean能不能进行自动注入,某个Bean的autowireCandidate属性是否等于truesetAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver())
当前BeanDefinition继承AbstractBeanDefinition 且有BeanClassbeanDef instanceof AbstractBeanDefinition && ((AbstractBeanDefinition) beanDef).hasBeanClass()
配置类不能是接口if (metadata.isInterface()) { return false; }
this.reader = new AnnotatedBeanDefinitionReader(this);
invokeBeanFactoryPostProcessors(beanFactory)
例如ApplicationContext,在单例池中不存在这个Bean,但是依然可以进行依赖的自动注入,就是从这里获取的
boolean reiterate = true;
true
判断一个类是否是配置类checkConfigurationClassCandidate(beanDef)
向单例池中添加Environment对象、System.getSystemProperties()返回的Map对象、System.getSystemEnvironment()返回的Map对象registerSingleton
比较器用来对order进行排序setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE)
false退出循环
refresh();
处理@Bean标注的方法Set<MethodMetadata> beanMethods = retrieveBeanMethodMetadata(sourceClass);
处理事件监听@EventListener注解new RootBeanDefinition(EventListenerMethodProcessor.class)
初始化一个事件发布器(SimpleApplicationEventMulticaster),用来发布事件initApplicationEventMulticaster();
return true
标注有Component、ComponentScan、Import、ImportResource注解的都是配置类for (String indicator : candidateIndicators) { if (metadata.isAnnotated(indicator)) { return true; } }
实例化非懒加载单例BeanfinishBeanFactoryInitialization(beanFactory);
Spring启动的最后一步设置ApplicationContext的lifecycleProcessor发布ContextRefreshedEvent事件finishRefresh();
处理@Import注解processImports
除@Configuration注解外,判断还有那些配置类isConfigurationCandidate(metadata)
String[] postProcessorNames =font color=\"#323232\
类中方法上有@Bean注解的也是配置类metadata.hasAnnotatedMethods(Bean.class.getName())
ignoreDependencyInterface
Bean的后置处理器,用来判断某个Bean是不是ApplicationListener,如果是就添加到Spring容器中addBeanPostProcessor(new ApplicationListenerDetector(this))
执行BeanFactoryPostProcessors,这里会进行配置类解析,包扫描等操作invokeBeanFactoryPostProcessors(beanFactory);
添加一些接口, 如果某个类实现 了这个接口且这个类中的某些set方法在接口中也存在, 那么这个set方法在自动注入的 时候是不会执行的@Autowired注解是忽略这个属性
拿到beanDefinition元数据metadata = AnnotationMetadata.introspect(beanClass);
提供给AbstractApplicationContext的子类进行扩展,子类实现可以继续向BeanFactory中添加东西,这里是空实现postProcessBeanFactory(beanFactory);
如果有@Configuration注解且proxyBeanMethods=true,设置当前配置为full配置config != null && !Boolean.FALSE.equals(config.get(\"proxyBeanMethods\
准备BeanFactoryprepareBeanFactory(beanFactory);
register
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(StartConfig.class);
经过配置解析和包扫描后,再次从Spring中获取并创建BeanDefinitionRegistryPostProcessor类型且继承了Ordered接口的BeanFactoryProcessor
执行完用户定义的BeanDefinitionRegistryPostProcessor后,也可能再次生成BeanDefinitionRegistryPostProcessor,所以这里会循环从Spring中获取BeanDefinitionRegistryPostProcessor并执行,直到没有BeanDefinitionRegistryPostProcessor为止
解析PropertySource注解processPropertySource(propertySource);
注册默认的ProcessorsAnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);
从BeanFactory中获取ApplicationListener类型的beanName, 然后添加 到ApplicationContext中的事件广播器applicationEventMulticaster中registerListeners();
提供给AbstractApplicationContext的子类进行扩展,这里是空实现onRefresh();
reiterate = true;
执行BeanDefinitionRegistryPostProcessor类型的beanFactoryPostProcessorregistryProcessor.postProcessBeanDefinitionRegistry(registry);
reiterate = false;
开始
Set<BeanDefinitionHolder> candidates = new LinkedHashSet<>(configCandidates);
BeanDefinitionRegistryPostProcessor执行后放入listregistryProcessors.add(registryProcessor);
配置类解析、包扫描ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(registry);
让ApplicationContext实现国际化功能,但首先需要定义一个messageSource的BeanDefinitioninitMessageSource();
new
循环用户添的beanFactoryPostProcessors,并执行
设置类加载器setBeanClassLoader(getClassLoader());
执行postProcessBeanDefinitionRegistry,这里具体实现类为ConfigurationClassPostProcessor,会执行配置类解析,包扫描等postProcessor.postProcessBeanDefinitionRegistry(registry);
BeanPostProcessor用来处理@Resource注解new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class)
processConfigurationClass()
这里就是获取继承了BeanFactoryPostProcessor的处理器,并按照PriorityOrdered、Ordered、普通处理器的顺序执行
isConfigurationCandidate(metadata)
执行父类GenericApplicationContext构造方法,创建bean工厂this.beanFactory = new DefaultListableBeanFactory();
上面步骤完成了扫描,用户可能自定义了一些BeanPostprocessor也扫描到了,这里会将所有Bean的后置处理器实例化registerBeanPostProcessors(beanFactory);
循环解析完所有的配置类while (!candidates.isEmpty());
创建配置类解析器,准备解析ConfigurationClassParser parser = new ConfigurationClassParser()
String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class
Bean的后置处理器,用来处理EnvironmentAware、ApplicationEventPublisherAware等回调方法addBeanPostProcessor(new ApplicationContextAwareProcessor(this))
0 条评论
回复 删除
下一页