Spring源码——初识Spring容器
Spring源码之工厂(容器)
为什么把Spring的工厂又叫做容器呢?
工厂的责任是创建对象,但是创建完对象后还要进行存储(针对于单例的对象来讲),以供其他地方使用,这就是容器。为了能存多个对象,并能方便查找,所以Spring创建的单实例对象是通过类似map的结构来存储的。
引申一下:
为什么有些人也把tomcat叫做容器?
因为tomcat不仅要创建servelet,还要存储servelet。
我们最常用的Spring工厂是ApplicationContext(应用上下文),这其实是Spring的高级工厂,它复合了很多的功能,我们在编程的过程中,用它最方便,实际上它的很多功能被Spring提供的其他的工厂分担了。所以我们可以认为ApplicationContext是编程过程中的一个门面。
正因为它的功能太多,所以我们在分析源码的时候,如果先从它入手,会分析乱了。
这个时候,我们就要找到Spring最为核心且典型的工厂——BeanFactory。
BeanFactory
BeanFactory是接口,我们先来看下BeanFactory的实现结构图。

它们的功能是什么呢?我们选择一些重要的来介绍一下。
BeanFactory:Spring体系中,最底层的工厂,定义了工厂的最基本操作。比如,存或取bean;
HierarchicalBeanFactory:提供了父子容器管理的功能;
AutowireCapableBeanFactory:
提供了自动注入的功能;

还提供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容器的更多相关文章
- Spring源码解析-ioc容器的设计
Spring源码解析-ioc容器的设计 1 IoC容器系列的设计:BeanFactory和ApplicatioContext 在Spring容器中,主要分为两个主要的容器系列,一个是实现BeanFac ...
- Spring源码-IOC部分-容器简介【1】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- Spring源码-IOC部分-容器初始化过程【2】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- spring源码:web容器启动(li)
web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...
- spring源码:web容器启动
web项目中可以集成spring的ApplicationContext进行bean的管理,这样使用起来bean更加便捷,能够利用到很多spring的特性.我们比较常用的web容器有jetty,tomc ...
- 创建ApplicationContext与BeanFactory时的区别-Spring源码学习之容器的基本实现
传送门 可以加载XML两种方法 使用 BeanFactory 加载 XML BeanFactory bf = new XmlBeanFactory(new ClassPathResource(&quo ...
- Spring源码:Spring IoC容器加载过程(2)
Spring源码版本:4.3.23.RELEASE 一.加载XML配置 通过XML配置创建Spring,创建入口是使用org.springframework.context.support.Class ...
- spring源码学习之容器的基本实现
最近想拿出一部分时间来学习一下spring的源码,还特意买了一本书结合来看,当然主要是学习并跟着作者的思路来踏上学习spring的源码的道路,特意在此记录一下,<spring源码深度解析> ...
- Spring源码:Spring IoC容器加载过程(1)
Spring源码版本:4.3.23.RELEASE 一.加载过程概览 Spring容器加载过程可以在org.springframework.context.support.AbstractApplic ...
- spring源码学习之容器的扩展(二)
六 BeanFactory的后处理BeanFactory作为spring容器的基础,用于存放所有已经加载的bean,为了保证程序上的高扩展性,spring针对BeanFactory做了大量的扩展,比如 ...
随机推荐
- [BitSail] Connector开发详解系列四:Sink、Writer
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 Sink Connector BitSail Sink Connector交互流程介绍 Sink:数据写入组件的生 ...
- 火山引擎DataTester:企业如何使用A/B实验优化商业化能力
商业化是企业将研发成果,如新产品.新技术.新服务等,转变成可盈利的商业化产品:整个流程中包含了研发.推广.服务,全程通过精细化管理运营.商业化的本质是流量的变现,而对企业而言,商业化链路的打磨至关 ...
- Mac Maven环境变量配置 zsh: command not found: mvn
之前配过环境变量,但是后来打开还是报 zsh: command not found: mvn 需要在运行前先刷下环境变量 source ~/.bash_profile 每次使用前都刷一下比较麻烦,这是 ...
- Java 网络编程 —— ServerSocket 详解
构造 ServerSocket ServerSocket 的构造方法有以下几种重载形式 ServerSocket() throws IOException ServerSocket(int port) ...
- 灵魂拷问std::enable_shared_from_this,揭秘实现原理
参考博客: std::enable_shared_from_this原理浅析 引言 在C++编程中,使用智能指针是一种安全管理对象生命周期的方式.std::shared_ptr是一种允许多个指针共享对 ...
- CPP-移动语义
"Move semantics allows us to optimize the copying of objects, where we no longer need the value ...
- jdk1.8(java8)新特性
借鉴之:https://blog.csdn.net/qq_28410283/article/details/80601495 Lambda 表达式: //1.Lambda 表达式,也可称为闭包,它是推 ...
- /etc/profile,/etc/bashrc,~/.profile,~/.bashrc 的区别及使用
转载请注明出处: /etc/profile 为系统的全局环境变量设置,此文件为系统的每个用户设置环境信息 /etc/bashrc 为每一个运行bash shell的用户执行此文件.当bash ...
- [转帖]Debian开启SSH
一.Debian开启SSH 参考链接: https://blog.csdn.net/zzpzheng/article/details/71170572 https://help.aliyun.com/ ...
- [转帖]Linux字符截取命令-cut
概述 cut是一个选取命令,.一般来说,选取信息通常是针对"行"来进行分析的,并不是整篇信息分析的. 语法 cut [-bn] [file] 1 或 cut [-c] [file] ...