首先提供了一个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. C++数组参数应用方式探讨(转)

    对于经验丰富的编程人员来说,C++编程语言应该是他们经常使用于程序开发的一种实用性语言.那么,在C++中,C++数组参数永远不会按值传递.它是传递第一个元素(准确地说是第0个)的指针. 例如,如下声明 ...

  2. Javascript-history.go()和history.back()的用法和区别

    简单的说就是:go(-1): 返回上一页,原页面表单中的内容会丢失:back(): 返回上一页,原页表表单中的内容会保留. history.go(-1):后退+刷新 history.back():后退 ...

  3. JQuery EasyUI 动态改变表单项的验证守则

    //JQuery EasyUI 动态改变表单项的验证规则 $(document).ready(function(){ $('#FILE_QUALITY').combobox({ onChange:fu ...

  4. angularjs中使用$scope.$watch监控对象模型的变化

    如果对象模型发生变化时,可以使用$scope.$watch监控变化 <html ng-app="myApp"> <head> <title>an ...

  5. 菜鸟从零学编程——GET与POST

    相信大家在面试的时候经常会被问到:GET与POST有什么区别吧?你是怎么回答的呢?POST比GEt安全?GET有URL的长度限制而POST没有或者很大?GET通过URL或者Cookie传参数,POST ...

  6. 算法笔记_016:凸包问题(Java)

    目录 1 问题描述 2 解决方案 2.1 蛮力法 1 问题描述 给定一个平面上n个点的集合,它的凸包就是包含所有这些点的最小凸多边形,求取满足此条件的所有点. 另外,形象生动的描述: (1)我们可以把 ...

  7. npm发包流程

    1.注册npm 账号 https://www.npmjs.com/signup 2.初始化npm项目 npm init 根据发的包进行填写: { "name": "wen ...

  8. 解决Android SDK Manager下载问题和android studio每次启动都要在fetching Android sdk compoment information

    1.能解决国内访问Google服务器的困难启动 Android SDK Manager ,打开主界面,依次选择「Tools」.「Options...」,弹出『Android SDK Manager - ...

  9. qq 自制表情包

      如何自制qq表情包? CreateTime--2018年2月5日15:34:35 Author:Marydon 1.添加表情 2.选择表情(可以进行多选) 3.对添加的表情进行分组 4.添加成功( ...

  10. 03-maven学习-eclipse中创建maven项目

    一,更改eclipse默认的maven配置 window->preference 选择本地maven目录 一直确定后 二,更改maven默认settings window->prefere ...