该类属于ApplicationContext子类,所以是一个BeanFactory,下面介绍本类中最重要的三个字段属性

// @Nullable注解表示该字段允许为空
//
// 该字段表示是否允许覆盖相同名称的对象
// 比如有一个类A,注册到容器中的名字叫m
// 又有一个类B,注册到容器中的名字也叫m
// 如果该字段=true,则B将会覆盖掉A
@Nullable
private Boolean allowBeanDefinitionOverriding;
// 如果该字段=true,则允许Bean之间循环依赖
@Nullable
private Boolean allowCircularReferences;/** Bean factory for this context. */
@Nullable
private volatile DefaultListableBeanFactory beanFactory;

了解上述字段属性,我们看下面的customizeBeanFactory方法

protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {// 此处判断是否为null,说明有其他地方很可能对其赋值if (this.allowBeanDefinitionOverriding != null) {beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);}// 此处判断是否为null,说明有其他地方很可能对其赋值if (this.allowCircularReferences != null) {beanFactory.setAllowCircularReferences(this.allowCircularReferences);}
}

继续说上述为什么判断=null,主要目的是为了我们自己实现ApplicationContext的时候重写setAllowBeanDefinitionOverriding和setAllowCircularReferences时候用的,也就是说如果当前ApplicationContext是我们自己实现的ApplicationContext的话,spring要判断一下我们的ApplicationContext是否对这两个字段进行了设置,其实从方法名customize就可以看出来的,这么设计和AbstractApplicationContext.prepareRefresh方法是一样的原则,下面是示例代码,该代码体现了customizeBeanFactory方法的用途

public class MysTest extends ClassPathXmlApplicationContext {//正是因为我重写了该方法,所以spring需要判断一下是否不为空@Overridepublic void setAllowBeanDefinitionOverriding(boolean allowBeanDefinitionOverriding) {super.setAllowBeanDefinitionOverriding(false);}//正是因为我重写了该方法,所以spring需要判断一下是否不为空@Overridepublic void setAllowCircularReferences(boolean allowCircularReferences) {super.setAllowCircularReferences(false);}public static void main(String[] args) {ClassPathXmlApplicationContext ctx = new MysTest();ctx.refresh();}
}

Spring-AbstractRefreshableApplicationContext相关推荐

  1. 学习Spring中遇到关于BeanFactory及测试类的问题

    最近在学习Spring,使用的是Spring 5.0.1 学习书本中使用的是4.0 学习书本中使用以下来加载配置文件及设置 Resource resource = new ClassPathResou ...

  2. 简述控制反转ioc_阅读Spring源码:IOC控制反转前的处理

    温馨提示:要怀着 这个世界很美好 的心态去看~ 技术经验交流:点击入群 ClassPathXmlApplicationContext的注册方式 源码分析基于Spring4.3 从ClassPathXm ...

  3. [Spring 深度解析]第7章 IoC容器的初始化过程

    7. IoC容器的初始化过程 ​ 简单来说,IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个方法标志着IoC容器的正式启动.具体来说,这个启动包括BeanDefinition的Re ...

  4. spring bean xml 调用方法_Spring通过Xml方式注册Bean的几处关键实现点

    1.前言 我们用SpringMVC的时候一般会用到Xml配置文件,那么我们这篇文章就来谈下Spring读取Xml配置文件的一些关键实现点. 2.AbstractRefreshableApplicati ...

  5. Spring 框架的设计理念与设计模式分析

    Spring 的骨骼架构 Spring 总共有十几个组件,但是真正核心的组件只有几个,下面是 Spring 框架的总体架构图: 图 1 .Spring 框架的总体架构图 从上图中可以看出 Spring ...

  6. (转)spring源码解析,spring工作原理

    转自:https://www.ibm.com/developerworks/cn/java/j-lo-spring-principle/ Spring 的骨骼架构 Spring 总共有十几个组件,但是 ...

  7. Spring component-scan类扫描加载过程

    2019独角兽企业重金招聘Python工程师标准>>> https://github.com/javahongxi 有朋友最近问到了spring加载类的过程,尤其是基于annotat ...

  8. Spring:源码解读Spring IOC原理

    2019独角兽企业重金招聘Python工程师标准>>> 一.什么是Ioc/DI? IOC容器:主要是完成了 完成对象的创建和依赖的管理注入等. 先从我们自己设计这样一个视角来考虑: ...

  9. 深入理解 Spring 之源码剖析IOC

    推荐两篇文章: https://www.jianshu.com/p/e4ca039a2272 https://www.cnblogs.com/ITtangtang/p/3978349.html 一.介 ...

  10. spring:如何用代码动态向容器中添加或移除Bean ?

    先来看一张类图: 有一个业务接口IFoo,提供了二个实现类:FooA及FooB,默认情况下,FooA使用@Component由Spring自动装配,如果出于某种原因,在运行时需要将IFoo的实现,则F ...

最新文章

  1. 管理单元初始化失败解决办法
  2. AOSP Ubuntu命令
  3. javascript闭包产生的内存泄漏
  4. boost::endian::endian_arithmetic的测试程序
  5. python xpath定位打印元素_python基础教程:8种selenium元素定位的实现
  6. i7 5500u linux,i7 5500u相当于什么cpu
  7. 方维分享系统,品牌无法设置分类关联
  8. linux 把秒数转换为正常时间格式命令
  9. 微信小程序4-小程序的api
  10. UEFI学习——事件函数WaitForEvent和CreateEvent/CreateEventEx
  11. CVPR 2021 Involution: Inverting the Inherence of Convolution for Visual Recognition
  12. tp6 集成swoole
  13. 哪个手机浏览器可以倍速_手机四款浏览器APP的比较
  14. GNSS精密轨道产品sp3与精密钟差产品clk批量下载(Linux Shell)
  15. 效果惊人:上古卷轴III等经典游戏也能使用超分辨率GAN重制了
  16. git 配置winmerge
  17. latex公式文字划掉的效果
  18. 豌豆荚Hack Day:百宝袋负责人访谈
  19. sparkGraphX 图操作:pregel(加强的aggregateMessages)
  20. POJ1655 Balancing Act 题解

热门文章

  1. SpringBoot整合Encahce后,访问页面页面出现异常信息,无法获取返回数据
  2. python将excel导入生成矩阵_Python导入数值型Excel数据并生成矩阵操作
  3. python窗口动态实时显示时间_量化交易实时动态监视系统(纯Python,只需要浏览器就能用)-直接GitHub开源可下载...
  4. nginx ---- Nginx服务器基础配置实例
  5. JavaSE----异常处理
  6. python语言中有3种表示字符串的方式、单引号和_Python中三种类型的引号(单引号、双引号、三引号)...
  7. 想要预览文件或是图片,将后端返回的信息转换为前端可以正常显示的格式
  8. Linux下安装Apache Maven安装
  9. C#如何关闭指定进程
  10. 使用DataX从ORACLE同步数据到MYSQL