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. 【Cxx 20】使用 std::span 代替数组指针传参

    我们知道std::string_view可以创建std::string的一个视图,视图本身并不拥有实例,它只是保持视图映射的状态.在不修改实例的情况下,使用std::string_view会让字符串处 ...

  2. QML笔记(四)之QML鼠标事件

    QML笔记(四)之QML鼠标事件

  3. (已解决)pulse secure 连接功能变灰禁用 连接面板找不到

    今天打开 pulse secure 时,发现窗口变成了这样: 连接功能是灰色的,被禁用了: 解决方案: 运行 PulseSecureService 服务. 然后就正常了!

  4. spring,springBoot配置类型转化器Converter以及FastJsonHttpMessageConverter,StringHttpMessageConverter 使用

    转载请注明出处: https://i.cnblogs.com/posts/edit;postId=14045507 spring,spring boot 等框架项目通过@RequestBody,@Re ...

  5. Nacos源码 (1) 源码编译及idea环境

    本文介绍从gitee下载nacos源码,在本地编译,并导入idea进行本地调试. 从gitee下载源码 由于github访问速度慢,所以我选择使用gitee的镜像仓库: git clone https ...

  6. javase项目 正常导入jar 包

    1,在 java project 目录下新建 lib 文件夹 2,将 mysql 的 jar 包 复制到 新建的 lib 文件夹 3,选中 lib 下的 jar 包 , 右键点击选择 build pa ...

  7. [转帖]Kubernetes1.25.6部署文档 使用cri-docker部署K8s1.25.6

    https://zhuanlan.zhihu.com/p/600808149 本文档将通过kubeadm+docker部署K8s集群,本次集群使用的容器运行工具为docker,K8s的容器运行工具也可 ...

  8. [转帖]实践真知:解决 Jdbc 连接 Oracle 12c 时快时慢的问题

    https://cloud.tencent.com/developer/article/1052506 李真旭@killdb Oracle ACE,云和恩墨技术专家 个人博客:www.killdb.c ...

  9. [转帖]redis缓存命中率介绍

    缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常来讲 ...

  10. [转帖]TiDB 使用 dumpling 导出数据,并使用 lightning 导入到另一个 TiDB 库

    本文介绍从 TiDB-A 库导出数据到 TiDB-B 库: 导出 Dumpling 包含在 tidb-toolkit 安装包中,可在此下载. 从 TiDB/MySQL 导出数据 需要的权限 SELEC ...