首先提供了一个Spring容器最简单的例子。

bean的定义,MyTestBean.java

public class MyTestBean {
private String testStr = "testStr"; public String getTestStr() {
return testStr;
} public void setTestStr() {
this.testStr = testStr;
}
}

配置文件的定义,beanFactoryTest.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.Springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.Springframework.org/schema/beans
http://www.Springframework.org/schema/beans/Spring-beans.xsd"> <bean id="myTestBean" class="bean.MyTestBean" /> </beans>

测试代码,BeanFactoryTest.java

@SuppressWarnings("deprecation")
public class BeanFactoryTest {
@Test
public void testSimpleLoad() {
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactoryTest.xml");
MyTestBean bean = (MyTestBean) bf.getBean("myTestBean");
assertEquals("testStr", bean.getTestStr());
}
}

那么在这个测试中有一个关键的类就是现在要学习一下的XmlBeanFactory。

这段测试代码完成的功能无非一下几点:

(1)读取配置文件beanFactoryTest.xml

(2)根据beanFactoryTest.xml中的配置找到对应的类的配置,并实例化。

(3)调用实例化后的实例。

public class XmlBeanFactory extends DefaultListableBeanFactory {
private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this); /**
* 根据给定的可以用DOM进行解析的resource创建一个新的XmlBeanFactory
* @param 代表resource的XML资源, 用来加载bean的定义
* @throws 一旦有加载或者解析异常即抛出BeansException异常
*/
public XmlBeanFactory(Resource resource) throws BeansException {
this(resource, null);
} /**
* 用给定的可用DOM解析的输入流创建一个新的XmlBeanFactory
* @param 代表resource的XML资源, 用来加载bean的定义
* @param parentBeanFactory 父bean工厂
* @throws 一旦有加载或者解析异常即抛出BeansException异常
*/
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
this.reader.loadBeanDefinitions(resource);
}
}

上面就是XmlBeanFactory.java的源码了,看上去也非常简单。

值得学习的是:

(1)用了两个构造函数,在一个中调用了另一个,实现了不同的逻辑

(2)Spring中有父子容器,这个点我还没有弄懂

类图结构就是这样的。

然后时序图是这样的:

跟之前说的一样,先是加载类资源:new ClassPathResource("beanFactoryTest.xml"),后续的资源处理就可以用Resource提供各种服务来操作了。

然后利用XmlBeanDefinitionReader读取bean的定义,最后实例化一个容器出来。

下一节会学习配置文件的封装,也就是从读取xml配置文件到内存中成为Resource的过程。

之前也有写过这方面的学习过程,但是写的东西太杂了,又没有回头巩固,感觉忘得很快。

XmlFactoryBean和DefaultListableBeanFactory学习的更多相关文章

  1. Spring 源码学习 04:初始化容器与 DefaultListableBeanFactory

    前言 在前一篇文章:创建 IoC 容器的几种方式中,介绍了四种方式,这里以 AnnotationConfigApplicationContext 为例,跟进代码,看看 IoC 的启动流程. 入口 从 ...

  2. Spring源码学习之IOC容器实现原理(一)-DefaultListableBeanFactory

    从这个继承体系结构图来看,我们可以发现DefaultListableBeanFactory是第一个非抽象类,非接口类.实际IOC容器.所以这篇博客以DefaultListableBeanFactory ...

  3. [spring源码学习]二、IOC源码——配置文件读取

    一.环境准备 对于学习源码来讲,拿到一大堆的代码,脑袋里肯定是嗡嗡的,所以从代码实例进行跟踪调试未尝不是一种好的办法,此处,我们准备了一个小例子: package com.zjl; public cl ...

  4. Spring IoC容器初始化过程学习

    IoC容器是什么?IoC文英全称Inversion of Control,即控制反转,我么可以这么理解IoC容器: 把某些业务对象的的控制权交给一个平台或者框架来同一管理,这个同一管理的平台可以称为I ...

  5. spring源码学习之路---深度分析IOC容器初始化过程(四)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 最近由于工作和生活,学习耽搁 ...

  6. Spring 源码学习

    spring最核心的理念是IOC,包括AOP也要屈居第二,那么IOC到底是什么呢,四个字,控制反转 一.什么是Ioc/DI? IoC 容器:最主要是完成了完成对象的创建和依赖的管理注入等等. 先从我们 ...

  7. Spring入门学习(一)

    SpringMVC基础平台补充(2016.03.03) 如果想要开发SpringMVC,那么前期依次安装好:JDK(jdk-8u74-windows-x64,安装后配置环境变量JAVA_HOME和CL ...

  8. Spring IOC及AOP学习总结

    一.Spring IOC体系学习总结: Spring中有两个容器体系,一类是BeanFactory.还有一类是ApplicationContext.BeanFactory提供了基础的容器功能.Appl ...

  9. Spring IOC核心源码学习

    1. 初始化 大致单步跟了下Spring IOC的初始化过程,整个脉络很庞大,初始化的过程主要就是读取XML资源,并解析,最终注册到Bean Factory中: 在完成初始化的过程后,Bean们就在B ...

随机推荐

  1. js和jquery判断事件流

    $('body').on('click',function(e){ var $target = $(e.target); if($target.parents('.fixNav>div').le ...

  2. git/github运用

    了解git和svn很久了,但是一直没有拿来做过版本控制管理,虽然svn有用到过,但是觉得还是运用git的比较多吧,尤其github. Git术语                             ...

  3. vue - 页面跳转

    HTML:a 小程序:navigator Vue:router-link 1. router-link => a标签 2. javascript标签跳转页面 2.1   2.2 3. 常用方法之 ...

  4. function(window, undefined)的意义

    var num = 10000 for (var i = 0; i++; i < num) { eval("pp" + i + "=" + i); } ( ...

  5. 算法笔记_132:最大流量问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 何为最大流量问题? 给定一个有向图,并为每一个顶点设定编号为0~n,现在求取从顶点0(PS:也可以称为源点)到顶点n(PS:也可以称为汇点)后,顶点 ...

  6. 百度地图API拾取坐标网址

    http://api.map.baidu.com/lbsapi/getpoint/index.html

  7. js 判断进入可视区域

      js 判断进入可视区域 CreateTime--2018年4月14日08:17:41 Author:Marydon 1.使用场景 图片懒加载时候需要用到,其他情况暂时没有遇到,欢迎留言补充! 2. ...

  8. Qt Multimedia Backends(多媒体后端)翻译

    目录 MediaService plugins 媒体服务插件 不同后端支持的媒体播放器功能: 后端支持的摄像头(相机)功能 后端支持的音频解码功能 Audio plugins 音频插件 原文地址: Q ...

  9. linux 下处理大文件

    .head tail more .先把大文件进行分割 split split 参数: -a, --suffix-length=N 指定输出文件名的后缀,默认为2个 -b, --bytes=SIZE 指 ...

  10. 【APP接口开发】chrome浏览器DHC工具安装使用(亲测有效)

    1.DHC文件获取地址:http://chromecj.com/web-development/2015-08/549/download.html 2.chrome安装DHC插件教程和步骤:http: ...