spring源码refresh()刷新容器详解

更新时间:2023-05-26 21:34:57 阅读: 评论:0

spring源码refresh()刷新容器详解
public void refresh() throws BeansException, IllegalStateException {
synchronized(this.startupShutdownMonitor) {
// Prepare this context for refreshing.
prepareRefresh();
// Tell the subclass to refresh the internal bean factory.
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
// Prepare the bean factory for u in this context.
prepareBeanFactory(beanFactory);
try{
// Allows post-processing of the bean factory in context subclass.
讨厌的英文
postProcessBeanFactory(beanFactory);
// Invoke factory processors registered as beans in the context.
invokeBeanFactoryPostProcessors(beanFactory);
// Register bean processors that intercept bean creation.
registerBeanPostProcessors(beanFactory);
// Initialize message source for this context.
initMessageSource();
// Initialize event multicaster for this context.
initApplicationEventMulticaster();
// Initialize other special beans in specific context subclass.
onRefresh();
/
/ Check for listener beans and register them.
registerListeners();
// Instantiate all remaining (non-lazy-init) singletons.
finishBeanFactoryInitialization(beanFactory);
// Last step: publish corresponding event.
finishRefresh();
}
catch(BeansException ex) {
if(logger.isWarnEnabled()) {
logger.warn("Exception encountered during context initialization - "+
"cancelling refresh attempt: "+ ex);
}
// Destroy already created singletons to avoid dangling resources.
destroyBeans();
// Ret 'active' flag.
cancelRefresh(ex);
// Propagate exception to caller.
throw ex;
}
finally{
// Ret common introspection caches in Spring's core, since we
// might not ever need metadata for singleton
西藏英文
retCommonCaches();
}
}
}
Spring容器refresh()创建刷新谷歌在线翻译英语
1、prepareRefresh()刷新前的预处理
1)initPropertySources()初始化⼀些属性设置;⼦类⾃定义个性化的属性设置⽅法
2)getEnvironment().validateRequiredProperties();校验属性的合法等
3)earlyApplicationEvents = new LinkedHashSet<ApplicationEvent>() 保存容器中⼀些早期的事件2、obtainFreshBeanFactory();获取BeanFactory
1)refreshBeanFactory()刷新【创建】容器
创建了⼀个this.beanFactory = new DefaultListableBeanFactory();并设置序列化id
2)getBeanFactory();返回上⼀步创建的beanFactory对象
3)将创建BeanFactory【DefaultListableBeanFactory】返回
3、prepareBeanFactory(beanFactory);BeanFactory的预准备⼯作【beanFactory】的⼀些设置
1)设置beanFactory的类加载器、⽀持表达式解析器
2)添加部分ApplicationContextAwareProcessor
3)设置忽略的⾃动装配的接⼝EnvironmentAware、EmbeddedValueResolverAware等等
4)注册可以解析的⾃动装配;我们能直接在任何组件中⾃动注⼊
BeanFactory、ResourceLoader、ApplicationEventPublisher、ApplicationContext
5)添加BeanPostProcessor【ApplicationListenerDetector】
6)添加编译时的AspectJ
7)给BeanFactory中注册⼀些能⽤的组件
environment【ConfigurableEnvironment】、systemProperties【Map<String, Object>】、systemEnvironment【Map<String, Object>】
4、postProcessBeanFactory(beanFactory)beanFactory准备⼯作完成后进⾏的后置处理⼯作
新概念英语第一册视频1)⼦类通过重写这个⽅法来在beanFactory创建并预准备完成以后做进⼀步的设置(在他⼦类实现)
----------------------------------------以上是beanFactory的创建以及预准备⼯作-----------------------
5、invokeBeanFactoryPostProcessors(beanFactory);
BeanFactoryPostProcessor:beanFactory的后置处理器。在beanFactory标准初始化之后执⾏的两个接⼝:BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor
先执⾏BeanDefinitionRegistryPostProcessor的⽅法
1)获取所有的BeanDefinitionRegistryPostProcessor
2)看先执⾏实现了PriorityOrdered接⼝的获取所有的BeanDefinitionRegistryPostProcessor postProcessor.postProcessBeanDefinitionRegistry(registry)
3)在执⾏实现了Ordered顺序接⼝的BeanDefinitionRegistryPostProcessor
postProcessor.postProcessBeanDefinitionRegistry(registry)
4)最后执⾏没有任何优先级或者是顺序接⼝的BeanDefinitionRegistryPostProcessor postProcessor.postProcessBeanFactory(beanFactory);
在执⾏BeanFactoryPostProcessor的⽅法
1)获取所有的BeanFactoryPostProcessor
2)看先执⾏实现了PriorityOrdered接⼝的获取所有的BeanFactoryPostProcessor
postProcessor.postProcessBeanFactory(beanFactory);
3)在执⾏实现了Ordered顺序接⼝的BeanFactoryPostProcessor
postProcessor.postProcessBeanFactory(beanFactory);
4)最后执⾏没有任何优先级或者是顺序接⼝的BeanFactoryPostProcessor
4)最后执⾏没有任何优先级或者是顺序接⼝的BeanFactoryPostProcessor
postProcessor.postProcessBeanFactory(beanFactory);
6、registerBeanPostProcessors(beanFactory);注册BeanPostProcessor(bean的后置处理器)【拦截创建】
不同接⼝类型的BeanPostProcessor;在Bean创建前后的执⾏时机是不⼀样的
InstantiationAwareBeanPostProcessor
DestructionAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor
MergedBeanDefinitionPostProcessor
1)获取所有的BeanPostProcessor;后置处理器都默认可以通过PriorityOrdered、Ordered接⼝执⾏优先级
2)先注册PriorityOrdered优先级的BeanPostProcessor;把没⼀个BeanPostProcessor添加到BeanFactory中beanFactory.addBeanPostProcessor(postProcessor);
3)在注册Ordered接⼝的
beanFactory.addBeanPostProcessor(postProcessor);
4)最后注册没有任何优先级接⼝的
beanFactory.addBeanPostProcessor(postProcessor);
5)最终注册MergedBeanDefinitionPostProcessor接⼝的
beanFactory.addBeanPostProcessor(postProcessor);
6)注册⼀个ApplicationListenerDetector;来在bean创建完成后检查是否是ApplicationListener如果是监听器applicationContext.addApplicationListener((ApplicationListener<?>) bean);
7、initMessageSource();初始化messageSource组件(做国际化功能)
1)获取BeanFactory
2)看容器中是否有id为messageSource的,类型是MessageSource的组件
如果有复制给messageSource,如果没有创建⼀个DelegatingMessageSource
MessageSource:取出国际化配置⽂件中的某个key的值;能按照区域信息获取
3)把创建好的MessageSource注册到容器中,以后获取国际化配置⽂件的值的时候可以⾃动注⼊isterSingleton(MESSAGE_SOURCE_BEAN_NAME, ssageSource);
8、initApplicationEventMulticaster()
1)获取BeanFactory
48个国际音标发音表2)从BeanFactory中获取ApplicationEventMulticaster
3)如果没有上⼀步配置,那就创建⼀个SimpleApplicationEventMulticaster
4)将创建的ApplicationEventMulticaster添加到BeanFactory中,以后其他组件直接⾃动注⼊
9、onRefresh();留给⼦容器
1、⼦类重写这个⽅法,在容器刷新的时候可以⾃定义逻辑(⽐如增加组件)
10、registerListeners();
1)从容器中拿到所有的ApplicationListener
2)将每个监听器添加到时间派发器中
getApplicationEventMulticaster().addApplicationListenerBean(listenerBeanName);
3)派发之前步骤产⽣的事件
11、finishBeanFactoryInitialization(beanFactory);初始化所有剩下的单实例bean
1、beanFactory.preInstantiateSingletons();初始化所有剩下的单实例bean
1)获取容器中的所有bean,依次进⾏初始化和创建对象
2)获取Bean的定义信息RootBeanDefinition
3)Bean不是抽象 是单例 不是懒加载
1)判断是否是FactoryBean;是否是实现FactoryBena接⼝的Bena
2)不是⼯⼚Bean。利⽤getBean(beanName)创建对象
1.doGetBean(name, null, null, fal)
2.先获取缓存中保存的单实例Bean。如果能获取到说明这个Bean之前被创建过(所有创建过的单实例Bean都会被缓存起来)
3.private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(256);
4. 缓存获取不到,开始Bean的创建对象流程
5.⽐较单钱Bean已经创建
6.获取Bean定义信息
7.获取当前Bean依赖的其他Bean;如果该有按照getBean()把依赖的Bean先创建出来DependsOn();
【InstantiationAwareBeanPostProcessor】提前执⾏先触发
【InstantiationAwareBeanPostProcessor】提前执⾏先触发
先触发 postProcessBeforeInstantiation()
如果有返回值 postProcessAfterInitialization()
3.如果【InstantiationAwareBeanPostProcessor】没有返回代理对象,调⽤4步
4.Object beanInstance = doCreateBean(beanName, mbdToU, args);创建Bean
1、【创建Bean实例】createBeanInstance(beanName, mbd, args);
利⽤⼯⼚⽅法或者对象的构造器创建出Bean实例
2、applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
调⽤后置处理器
3、【Bean属性赋值】populateBean(beanName, mbd, instanceWrapper)
赋值之前:
1.拿到InstantiationAwareBeanPostProcessor后置处理器
postProcessAfterInstantiation()
2.拿到InstantiationAwareBeanPostProcessor后置处理器
postProcessPropertyValues()
3.应⽤Bean属性的值,为属性利⽤tter⽅法等进⾏赋值
香港大学分数线applyPropertyValues(beanName,mbd,bw,pvs)
4、【Bean初始化】InitializingBean(beanName,expodObject,mbd)
1.【执⾏Aware⽅法】invokeAwareMethods(beanName, bean);执⾏以下xxxAware接⼝
BeanNameAware\BeanClassLoaderAware\BeanFactoryAware
2.【执⾏后置处理器初始化⽅法】applyBeanPostProcessorsBeforeInitialization
BeanPostProcessor.postProcessBeforeInitialization()
3.【执⾏初始化⽅法】invokeInitMethods(beanName, wrappedBean, mbd);eleventh
--是否是InitializingBean接⼝的实⾏;执⾏接⼝规定的初始化
--是不是⾃定义初始化⽅法
4.【执⾏后置处理器初始化之后】applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName)            beanProcessor.postProcessAfterInitialization(result, beanName)
5.注册Bean的销毁⽅法并不是执⾏registerDisposableBeanIfNecessary(beanName, bean, mbd);
大柄5) 将创建的bean添加到缓存中singletonObjects
ioc容器就是这些Map,很多的Map⾥⾯保存了单实例Bean,环境信息等
英语缩写词
所有Bean都利⽤getBean创建完成以后检查所有Bean是否是SmartInitializingSingleton接⼝的如果是就执⾏smartSingleton.afterSingletonsInstantiated();
12、finishRefresh()完成BeanFactory的初始化创建⼯作,IOC容器就创建完成
1.initLifecycleProcessor()初始化和⽣命周期有关的后置处理器;LifecycleProcessor
默认从容器中找是否有LifecycleProcessor的组件东京大学学费
写⼀个LifecycleProcessor的实现类,可以在BeanFactory
void onRefresh();刷新完成
void onClo();关闭
拿到前⾯定义的⽣命周期处理器(BeanFactory) 回调onRefresh
3.publishEvent(new ContextRefreshedEvent(this));发布容器刷新完成事件
isterApplicationContext(this);

本文发布于:2023-05-26 21:34:57,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/123795.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

下一篇:Android解决
标签:创建   容器   获取   完成   后置   刷新
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图