Spring源码之工厂(容器)

为什么把Spring的工厂又叫做容器呢?

工厂的责任是创建对象,但是创建完对象后还要进行存储(针对于单例的对象来讲),以供其他地方使用,这就是容器。为了能存多个对象,并能方便查找,所以Spring创建的单实例对象是通过类似map的结构来存储的。

引申一下:
为什么有些人也把tomcat叫做容器?
因为tomcat不仅要创建servelet,还要存储servelet。

我们最常用的Spring工厂是ApplicationContext(应用上下文),这其实是Spring的高级工厂,它复合了很多的功能,我们在编程的过程中,用它最方便,实际上它的很多功能被Spring提供的其他的工厂分担了。所以我们可以认为ApplicationContext是编程过程中的一个门面。

正因为它的功能太多,所以我们在分析源码的时候,如果先从它入手,会分析乱了。

这个时候,我们就要找到Spring最为核心且典型的工厂——BeanFactory

BeanFactory

BeanFactory是接口,我们先来看下BeanFactory的实现结构图。

它们的功能是什么呢?我们选择一些重要的来介绍一下。

  • BeanFactory:Spring体系中,最底层的工厂,定义了工厂的最基本操作。比如,存或取bean;

  • HierarchicalBeanFactory:提供了父子容器管理的功能;

  • AutowireCapableBeanFactory:

    1. 提供了自动注入的功能;

    2. 还提供intinitialBean(初始化单例bean时调用其中的afterPropertieSet方法)、DisposeBean(销毁单例bean之前调用其中的destory方法)的功能;

  • ListableBeanFactory:可以获取相关的配置信息 ,比如constrainsBeanDefinition、getBeanNameForType等信息;

  • ConfigurableBeanFactory:提供了如下功能:

    配置创建的是单实例还是多实例 (scope)、类型转换器的功能,后置处理Bean的功能;

  • DefaultListableBeanFactory:符合上述所有主要工厂能力 的一个类型;

  • XmlBeanFactory:内部有XmlBeanDefinitionReader的工具类,可以使用基于XML配置的信息,完成对象的创建;

  • ApplicationContext:集工厂功能大成的类型,编程时使用。

我们主要使用XmlBeanFactory来分析Spring工厂,之所以用它,是因为其内部有XmlBeanDefinitionReader工具类,可以读取xml的信息。

获取对象的简单代码演示:

//1. 读取XML配置文件,XML配置文件 封装 Java对象 ---> 创建工厂生产的对象
BeanFactory beanFactory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
//2. 从工厂容器中获得对象
User user = (User) beanFactory.getBean("u");

Spring源码——初识Spring容器的更多相关文章

  1. Spring源码解析-ioc容器的设计

    Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...

  2. Spring源码-IOC部分-容器简介【1】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  3. Spring源码-IOC部分-容器初始化过程【2】

    实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...

  4. spring源码:web容器启动(li)

    web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...

  5. spring源码:web容器启动

    web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...

  6. 创建ApplicationContext与BeanFactory时的区别-Spring源码学习之容器的基本实现

    传送门 可以加载XML两种方法 使用 BeanFactory 加载 XML BeanFactory bf = new XmlBeanFactory(new ClassPathResource(&quo ...

  7. Spring源码:Spring IoC容器加载过程(2)

    Spring源码版本:4.3.23.RELEASE 一.加载XML配置 通过XML配置创建Spring,创建入口是使用org.springframework.context.support.Class ...

  8. spring源码学习之容器的基本实现

    最近想拿出一部分时间来学习一下spring的源码,还特意买了一本书结合来看,当然主要是学习并跟着作者的思路来踏上学习spring的源码的道路,特意在此记录一下,<spring源码深度解析> ...

  9. Spring源码:Spring IoC容器加载过程(1)

    Spring源码版本:4.3.23.RELEASE 一.加载过程概览 Spring容器加载过程可以在org.springframework.context.support.AbstractApplic ...

  10. spring源码学习之容器的扩展(二)

    六 BeanFactory的后处理BeanFactory作为spring容器的基础,用于存放所有已经加载的bean,为了保证程序上的高扩展性,spring针对BeanFactory做了大量的扩展,比如 ...

随机推荐

  1. 【flask】蓝图的使用方式 g对象的使用 flask配置数据库连接池

    目录 上节回顾 今日内容 1 蓝图的使用 2 g对象 g对象 vs request对象 3 数据库连接池 上节回顾 全局request对象.线程会处理请求,确保线程中的数据不错乱. django_se ...

  2. 核心工具之 ideavim

    对于个人的核心工具集的选择,因为编程中熟练使用主力IDE能够大大提高效率,所以IDE是一个必选项.而IDE与VIM结合的插件,对于VIM使用者,常常是一个必选项. 在Jetbrains系列工具中,插件 ...

  3. Codeforces Round #734 (Div. 3) A~D1 个人题解

    比赛链接:Here 1551A. Polycarp and Coins (签到) 题意: 我们有任意个面额为 \(1\) 和 \(2\) 的硬币去支付 \(n\) 元账单, 现在请问怎么去分配数额使得 ...

  4. Educational Codeforces Round 6 620E. New Year Tree(DFS序+线段树)

    题目链接:点击打开链接 题意:给你一棵树,编号1~n,告诉你根结点是1. 每次有两个操作: 1,将以v为根的子树的结点全部染成颜色c 2,问以v为根的紫书的结点的颜色种类. 思路:如果这是一条线段的话 ...

  5. uni-app实现扫码签到

    1 uni.scanCode({ 2 success: res => { 3 this.$http({ 4 url: '/checkin/scanSign', 5 data: { 6 codeI ...

  6. springboot+dubbo+myBatis实现微服务集成

    springboot+dubbo+myBatis实现微服务集成 代码下载:https://download.csdn.net/download/typ1805/10485048 微服务架构成了当下的技 ...

  7. freeswitch的mod_xml_curl模块动态获取dialplan

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. mod_xml_curl模块支持从web服务获取xml配置,本文介绍如何动态获取dialplan配置. 环境 centos:Cent ...

  8. windows10/liunx创建空大文件

    1.windows10创建空大文件打开cmd命令,进入需要创建文件的目录,使用以下命令创建 fsutil file createnew test001.txt 1073741824 最后的数字代表文件 ...

  9. python常见面试题讲解(九)字符个数统计

    题目描述 编写一个函数,计算字符串中含有的不同字符的个数.字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里.不在范围内的不作统计.注意是不同的字符 输入描述: 输入N个字符,字符在 ...

  10. 函数传参中,形参类型为何使用const char*,而不是用char*

    1.当传递常量字符串给 char* 类型的形参时,C++ 编译器可能会发出警告,因为 char* 可以用于修改字符串内容.而使用 const char* 类型,则指示调用者不应该修改传入的字符串内容, ...