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做了大量的扩展,比如 ...
随机推荐
- Markdown Emojio 表情图标
:smile: :laughing: :blush: :smiley: ️ :relaxed: :smirk: :heart_eyes: :kissing_heart: :kissin ...
- Java 日志框架学习笔记
日志概念 1. 日志文件 日志文件是用于记录系统操作事件的文件集合 1.1 调试日志 1.2 系统日志 系统日志是记录系统中硬件.软件和系统问题的信息,同时还可以监视系统中发生的事件.用户可以通过它来 ...
- Django rest_framework使用自定义异常
完整代码 https://gitee.com/mom925/django-system 在settings.py中配置 REST_FRAMEWORK = { "EXCEPTION_HANDL ...
- 初始环境(centos7)
#!/bin/bash yum -y install wget #更换阿里源 下载epel源 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d ...
- 如何在传统前端项目中进行javascript模块化编程,并引入使用vue.js、element-ui,并且不依赖nodejs和webpack?
最近接手一个Web三维项目,前后端分离,前端是传统的前端项目,但又是模块化的开发方式,在修改的过程中,我需要做一些增删改查的功能,又想尽可能少的写css.尽可能少的直接操作DOM元素,所以引入了ele ...
- Markdown 文档测试--demo
Editor.md hhh 换行TEST 1 2 3 a b q d HEAD TEST Smart Test ... -- 目录 (Table of Contents) [TOCM] 目录 Edit ...
- Python | 使用SVM支持向量机进行鸢尾花分类
运行环境 Python: 3.7.1 库: sklearn (Python的机器学习工具箱) 目的: 根据鸢尾花的四个特征,对三种鸢尾花进行分类 数据(共150行,这里截取前6行,完整数据以及代码的下 ...
- watch监听对象遇坑
当以下数据,有一个变化,就重新调接口. formInline: { needTrain: '', trainResult: '', userNameS ...
- Winform的使用
Winform是什么 以下内容,来自朝夕教育课程,没有基础的可以去朝夕学学.这里主要是为了方便我自己回顾查询 创建Winform程序 Program类 Winform项目结构介绍 Winform控件简 ...
- java项目实战-jdbc实现-书城的增删改查-day21
目录 1. 安装mysql 安装navicate 2. jdbc实现增删改查 1. 安装mysql 安装navicate 参考网上资料 创库 创表 并放入3条测试数据 2. jdbc实现增删改查 bo ...