博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring源码 16 IOC refresh方法11
阅读量:37194 次
发布时间:2020-08-01

本文共 3627 字,大约阅读时间需要 12 分钟。

参考源

《Spring源码深度解析(第2版)》

版本

本文章基于 Spring 5.3.15


Spring IOC 的核心是 AbstractApplicationContextrefresh 方法。

其中一共有 13 个主要方法,这里分析第 11 个:finishBeanFactoryInitialization

1 AbstractApplicationContext

1-1 初始化剩下的单实例

finishBeanFactoryInitialization(beanFactory)
protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {   if (beanFactory.containsBean(CONVERSION_SERVICE_BEAN_NAME) && beanFactory.isTypeMatch(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class)) {      beanFactory.setConversionService(beanFactory.getBean(CONVERSION_SERVICE_BEAN_NAME, ConversionService.class));   }   if (!beanFactory.hasEmbeddedValueResolver()) {      beanFactory.addEmbeddedValueResolver(strVal -> getEnvironment().resolvePlaceholders(strVal));   }   String[] weaverAwareNames = beanFactory.getBeanNamesForType(LoadTimeWeaverAware.class, false, false);   for (String weaverAwareName : weaverAwareNames) {      getBean(weaverAwareName);   }   beanFactory.setTempClassLoader(null);   // 冻结所有的 bean 定义,说明注册的 bean 定义将不被修改或任何进一步的处理   beanFactory.freezeConfiguration();   // 初始化剩下的单实例(非惰性的)   beanFactory.preInstantiateSingletons();}

1-2 冻结所有的 bean 定义

beanFactory.freezeConfiguration()

2 DefaultListableBeanFactory

public void freezeConfiguration() {   this.configurationFrozen = true;   this.frozenBeanDefinitionNames = StringUtils.toStringArray(this.beanDefinitionNames);}

1 AbstractApplicationContext

1-2 初始化剩下的单实例

beanFactory.preInstantiateSingletons()

2 DefaultListableBeanFactory

public void preInstantiateSingletons() throws BeansException {   if (logger.isTraceEnabled()) {      logger.trace("Pre-instantiating singletons in " + this);   }   List
beanNames = new ArrayList<>(this.beanDefinitionNames); for (String beanName : beanNames) { RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) { if (isFactoryBean(beanName)) { Object bean = getBean(FACTORY_BEAN_PREFIX + beanName); if (bean instanceof FactoryBean) { FactoryBean
factory = (FactoryBean
) bean; boolean isEagerInit; if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) { isEagerInit = AccessController.doPrivileged( (PrivilegedAction
) ((SmartFactoryBean
) factory)::isEagerInit, getAccessControlContext()); } else { isEagerInit = (factory instanceof SmartFactoryBean && ((SmartFactoryBean
) factory).isEagerInit()); } if (isEagerInit) { getBean(beanName); } } } else { getBean(beanName); } } } for (String beanName : beanNames) { Object singletonInstance = getSingleton(beanName); if (singletonInstance instanceof SmartInitializingSingleton) { StartupStep smartInitialize = this.getApplicationStartup().start("spring.beans.smart-initialize").tag("beanName", beanName); SmartInitializingSingleton smartSingleton = (SmartInitializingSingleton) singletonInstance; if (System.getSecurityManager() != null) { AccessController.doPrivileged((PrivilegedAction
) () -> { smartSingleton.afterSingletonsInstantiated(); return null; }, getAccessControlContext()); } else { smartSingleton.afterSingletonsInstantiated(); } smartInitialize.end(); } }}

转载地址:http://wypwwy.baihongyu.com/

你可能感兴趣的文章
flowable集成后扫描不到jar包中mapping而报错
查看>>
flowable表单设计器选型
查看>>
高可用 Redis 服务架构分析与搭建
查看>>
flowable使用extensionElements自定义节点
查看>>
flowable自定义节点属性
查看>>
UE4-Gameplay技能系统
查看>>
TArray的MoveTemp推荐
查看>>
UnrealVS插件使用
查看>>
UE4 Low Level Memory Tracker使用
查看>>
UE4 PhyX物理引擎应用介绍
查看>>
UE4获取指定目录下所有文件
查看>>
UE4 遍历UserWidget下所有UI对象
查看>>
UE4 ReplicationGraph系统介绍
查看>>
过渡,动画与转换
查看>>
详解 弹性盒子
查看>>
js全选与全不选
查看>>
js放大镜
查看>>
js 倒计时demo
查看>>
js案例 生成行列随机颜色
查看>>
去除层叠样式表
查看>>