spring源码-3

AbstractApplicationContext.refresh
1 prepareRefresh:initPropertySources(子类可扩展,如设置某个属性为required),Environment.validateRequiredProperties()
2 obtainFreshBeanFactory:
refreshBeanFactory:若存在beanFactory则先摧毁其中单例并引用赋值null(让gc回收beanFactory),创建beanFactory,customizeBeanFactory,创建XmlBeanDefinitionReader并loadBeanDefinitions(针对各configResources和configLocations)
getBeanFactory:获取刚创建的beanFactory
3 prepareBeanFactory:
3.1 beanFactory.setBeanExpressionResolver:spel(用于spring表达式语言解析,如下图)
在这里插入图片描述

populateBean-applyPropertyValues-创建BeanDefinitionValueResolver并调用resolveValueIfNecessary-beanFactory.evaluateBeanDefinitionString-BeanExpressionResolver.evaluate

3.2 beanFactory.addPropertyEditorRegistrar(new ResourceEditorRegistrar(this, getEnvironment()));
PropertyEditor:xml内进行DI时我们只能给String值,通过PropertyEditor转换为实际的依赖类型
PropertyEditorRegistrar:可定制PropertyEditorRegistry,在其registerCustomEditors方法内向PropertyEditorRegistry注册各种PropertyEditor
PropertyEditorRegistry:可向内注册PropertyEditor
可向beanFactory注册PropertyEditorRegistrar和PropertyEditor
CustomEditorConfigurer:是BeanFactoryPostProcessor,将其内部的PropertyEditorRegistrar和PropertyEditor注册到beanFactory内
beanFactory生成BeanWrapper(本身是PropertyEditorRegistry)后,将beanFactory内部的PropertyEditor注册到BeanWrapper,并且beanFactory内部的PropertyEditorRegistrar去定制BeanWrapper
BeanWrapper默认实现BeanWrapperImpl会默认创建许多PropertyEditor

3.3 beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
一些特殊的Aware接口的调用

3.4 ignoreDependencyInterface
autowire时忽略上面特殊的Aware接口带来的属性设置

3.5 beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);等
autowire时针对类型直接定位到指定对象(应该autowireByType)

3.6 其他处理
4 postProcessBeanFactory(留给子类扩展)
5 invokeBeanFactoryPostProcessors:ApplicationContext里注册了一些BeanFactoryPostProcessor,beanFactory可能含有BeanFactoryPostProcessor,这两类都需要在此调用
5.1 BeanFactoryPostProcessor可能是BeanDefinitionRegistryPostProcessor,若beanFactory也是BeanDefinitionRegistry,那么需调用postProcessBeanDefinitionRegistry
5.2 可能实现PriorityOrdered或Ordered或未实现任意,保证调用顺序(先PriorityOrdered然后Ordered然后未实现的,并且PriorityOrdered和Ordered的order值越大调用越晚)
5.3 举例:PropertyPlaceholderConfigurer就是BeanFactoryPostProcessor,内部创建BeanDefinitionVisitor,访问处理每一个BeanDefinition,具体为访问其中PropertyValues,parentName,beanClassName等,BeanDefinitionVisitor内部含StringValueResolver(一般先根据Properties解析placeholder,然后根据系统属性解析,当然这个可颠倒配置)
在这里插入图片描述
6 registerBeanPostProcessors
beanFactory本来就可能硬编码有一些BeanPostProcessor,这里获取xml里的BeanPostProcessor并注册,
同样需要考虑PriorityOrdered,Ordered和无序的

7 initMessageSource
若beanFactory含此bean,设置给ApplicationContext,否则创建并设置给ApplicationContext并放入beanFactory
Locale: 语言和国家/地区,如中文有大陆中文和台湾中文
支持国际化:根据客户端的情况(Locale)返回合适的信息。
常用实现:ResourceBundleMessageSource
ApplicationContext本身也是MessageSource,当然它的实现是委托给内部的MessageSource,如getMessage(code, args, locale)

8 initApplicationEventMulticaster
若beanFactory含此bean,设置给ApplicationContext,否则创建并设置给ApplicationContext并放入beanFactory

9 registerListeners
将ApplicationContext内的ApplicationListener和xml内配置的ApplicationListener注册到ApplicationEventMulticaster
那么将ApplicationEvent广播给ApplicationEventMulticaster其实是给到了其内部的ApplicationListener,这里可以广播earlyApplicationEvents

10 finishBeanFactoryInitialization
xml配置了conversionService则调用beanFactory.setConversionService
比如ConversionServiceFactoryBean,getObject返回单例的DefaultConversionService,此conversionService含有配置在FactoryBean的多个Converter<S, T>(含方法T convert(S source)),生成BeanWrapper后将beanFactory的conversionService设置给BeanWrapper
beanFactory.freezeConfiguration:说明bean定义不被修改或进一步处理
beanFactory.preInstantiateSingletons:对单例的且非LazyInit的提前实例化

11 finishRefresh
确保LifecycleProcessor存在:和MessageSource一样
调用LifecycleProcessor.onRefresh:默认实现下找出Lifecycle的Bean,并调用其start方法,需要考虑调用顺序,通过Phased接口,LifecycleGroup
发布ContextRefreshedEvent

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值