Spring容器刷新obtainFreshBeanFactory的方法是什么


本篇内容主要讲解“Spring容器刷新obtainFreshBeanFactory的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring容器刷新obtainFreshBeanFactory的方法是什么”吧!你要是看 spring 源码会发现 BeanFactory 的实现类相当多,而且还有各种子接口以及子接口的实现类。ApplicationContex免费云主机域名tBeanFactory,但是你不能说 BeanFactoryApplicationContextApplicationContext 实现了 BeanFactory 的同时增强了 BeanFactory,所谓的增强大体上指的是上图中 ApplicationContext 实现的除了 BeanFactory 接口之外的其他接口的功能。本文仅仅列出常用的两类实现。如下图所示:那么这么多的实现类,实际应用中到底实例化的是哪个?这个问题嘛…… 看情况……上图列出来两大类实现:xml 版的实现: 大体上指的是(不是绝对) AbstractRefreshableApplicationContext 的子类也就是当年我们哼哧哼哧集成 springservlet 那个年代的事情大多数不就是 ClassPathXmlApplicationContext 吗?(略过)注解版 的实现: 大体上指的是(不是绝对) GenericApplicationContext 的子类Webflux 环境下一般是 AnnotationConfigReactiveWebServerApplicationContextServlet 环境下一般是 AnnotationConfigServletWebServerApplicationContext这里提到的实现类,无论是哪个,都是派生自 AbstractApplicationContext 的。他们都是 BeanFactory。既然有 N 个 BeanFactory 的实现类,那么我们应用程序中到底使用的是哪一个呢? 文章末尾再说,先把我们本期的重点 obtainFreshBeanFactory() 的逻辑介绍完。obtainFreshBeanFactory() 的工作就是在刷新之前搞到一个 热乎的 BeanFactory 实例,涉及到的两个方法都是由子类实现的。refreshBeanFactory(): 刷新 BeanFactory,由不同的子类提供各自的实现。getBeanFactory(): 返回当前 ApplicationContext 中创建好的 BeanFactory,简单的实现往往就是一个 getter 方法。下面看看 AbstractRefreshableApplicationContextGenericApplicationContext 这两种经典的实现类中 refreshBeanFactory()getBeanFactory() 方法的的逻辑。GenericApplicationContextobtainFreshBeanFactory() 的实现几乎什么也没做:所有对 Bean的注册 相关的方法都委托给了内部维护的 DefaultListableBeanFactory beanFactory。该系列的实现是不支持多次刷新操作的refreshBeanFactory() 也仅仅是给内部的 beanFactory 初始化了一个 IDgetBeanFactory() 的实现更干脆: 直接将内部维护的 beanFactory 返回接结束了看 AbstractRefreshableApplicationContext 的名字就能知道,这个系列的实现是支持多次刷新操作的(不像上面说的 GenericApplicationContext 这种只支持刷新一次)。内部也维护着一个 DefaultListableBeanFactory beanFactory, 值得注意的是这个 beanFactory 是被 volatile 修饰的(涉及到多次刷新,频繁修改 beanFactory 的引用指向)。对 refreshBeanFactory() 的实现分为两大步骤:销毁之前可能存在的旧的 beanFactorydestroyBeans: 销毁 beanFactory 中所有单例(毕竟此时beanFactory都要销毁了,beanFactory中的单例肯定要顺带给销毁掉)closeBeanFactory: 实际上就是 this.beanFactory = null;新建一个 beanFactory 并做一些必要的初始化DefaultListableBeanFactory temp = createBeanFactory();: 重新创建一个 BeanFactory 实例temp.setSerializationId(getId());: 设置 idcustomizeBeanFactory(temp); 实际上就是给 allowCircularReferencesallowBeanDefinitionOverriding 赋值loadBeanDefinitions(temp); 给新创建的 BeanFactory 中加载 BeanDefinitionthis.beanFactory = temp; 新创建的 temp 上位这一步是抽象方法,不同子类的实现不同但基本上都是委托各种各样的 BeanDefinitionReader 给新创建的 BeanFactory 中添加 BeanDefinitionAbstractRefreshableApplicationContextgetBeanFactory() 的实现也仅仅是返回了 this.beanFactoryApplicationContext 的实现类有一大堆,在应用程序中到底怎么确定使用哪个实现类的呢?下面就以传统的 Servlet 环境和 spring-boot 环境为例大概看一下流程。在传统的 Servlet 环境下,都会配置一个 ContextLoaderListener 来加载上下文。获取名为 contextClassServlet 初始化参数如果能获取到 contextClass 配置, 就直接反射创建一个 contextClass 指定的类作为 ApplicationContext如果获取不到 contextClass 配置,就走默认策略所谓默认策略就是从 spring-web.jarorg.springframework.web.context.ContextLoader.ContextLoader.properties 文件中读取默认的 WebApplicationContext 实现类型默认的 WebApplicationContext 的实现类是 XmlWebApplicationContext下面是和这个过程相关的几个源码文件:web.xmlContextLoaderListener.javaContextLoader.javaContextLoader.properties下面再简单提一下 spring-boot 环境中 ApplicationContext 的创建。这里特指基于 spring-bootweb 项目。他是通过 ApplicationContextFactory 来创建 ApplicationContextApplicationContextFactory 就是一个专门用来生产 ApplicationContext 的工厂类。源码如下,具体细节会在 spring-boot 相关系列文章中提到,此处先略过。到此,相信大家对“Spring容器刷新obtainFreshBeanFactory的方法是什么”有了更深的了解,不妨来实际操作一番吧!这里是百云主机网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: C++怎么实现将数据写入Excel工作表

今天小编给大家分享一下C++怎么实现将数据写入Excel工免费云主机域名作表的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。有两种方法可以将 Sp…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/25 22:02
Next 05/25 22:02

相关推荐