Spring核心之Ioc容器走读笔记

其实说到Spring的核心,无非指的就是Ioc容器AOP

Spring降低了应用的负载和框架的侵入性,依靠的解决方案正是Ioc和AOP的支持。

学习Spring的Ioc和Aop的设计模式可以帮助我们在自己编写代码的时候如何优雅的设计和实现。

这里就只记录一下自己对Ioc容器设计和实现的走读和思考。

在查看Spring Ioc容器的设计文档和源代码后,发现其实只有2类主要的容器:

一类是实现BeanFactory接口,这类的容器只实现了基本的方法,从名字上就大概能知道是什么功能:一类是实现ApplicationContext接口,继承了ListableBeanFactory, HierarchicalBeanFactory,
MessageSource, ApplicationEventPublisher, ResourcePatternResolver,包括了Beanfactory定义的所有功能和自己增加了许多面向框架的特性。

基本上这2类涵盖了所有常用到的Ioc容器的方法。

在需要自己定制特定功能的容器的时候,可以参考已经定义好的容器产品,不需要自己再来重新设计了。

具体的继承关系可以通过源代码来查看:可以看到ApplicationContext之所以比beanFactory高级是因为它不仅继承了beanFactory,而且还继承了其它的接口。

1.为了理解beanFactory这一类简单容器的bean的初始化过程,可以看一下它的一个常见的最底层实现XmlBeanFactory:其中AbstractBeanFactory是实现ConfigurableBeanFactory接口的抽象类。
其实看spring的源码,它的命名规范是值得学习的,从每个名字上看都可以大致明白它的功能。

这个是从xml文件中读取bean配置并初始化bean。 看XmlBeanFactory的构造方法: 在构造方法中需要得到Resource对象,然后使用XmlBeanDefinitionReader这个对象的loadBeanDefinitions来进行解析载入的过程。

2.再来看一下更高级一点的ApplicationContext容器的实现,因为它又继承了更多的接口,所有具有更多的特性,比如访问资源的多样性,支持事件等。找到一个简单的底层实现类FileSystemXmlApplicationContext,它是继承了抽象类AbstractXmlApplicationContext,继承关系图如下: 因为是抽象类肯定有一部分的方法它已经实现了,这里只需要完成自己扩展的方法就可以了。

看一下它的构造方法: 操作类似的方法全部在基类中实现,比如refresh();setConfigLocations();refresh中包括资源的解析,校验,和注册会在容器启动的时候执行。

refresh方法里面看到了很多步骤,关键的步骤是它如何获取并刷新beanFactory的,可以看看obtainFreshBeanFactory方法,它调用了一个抽象方法refreshBeanFactory,找到它在AbstractRefreshableApplicationContext的实现: 可以看到先有一个销毁的过程,然后再创建....现在明白它为什么会叫refreshAbleApplicationContext了....
然后又进入loadBeanDefinitions(beanFactory)过程了。 接下来的步骤就和基本的容器实现一样了.... 再来看看loadBeanDefinitions的实现: 发现太长了,这里就不贴了....

跟踪到了registerBeanDefinitions方法:

先对XML进行解析,具体的解析是通过BeanDefinitionParserDelegate类parseBeanDefinitionElement类进行的。再往底层方法查看,解析过程中用到了很多hashmap,set,而且发现在spring的bean配置中用到的功能性标签居然写死在了代码中: 看来spring支持的标签也不会经常变化了。

初始化过程到这里算是完结了,但是后面还有一个比较关键的步骤,就是根据依赖的关系(refresh标签)进行注入,或者是自己通过调用getBean方法来促发依赖注入。 基本上都是通过BeanDefinition结构中的refrence标签去填充bean对象的。

大概的流程基本上分成了3步,找到资源文件(可以通过xml文件或者file路径等),解析资源文件(把获取的资源解析成BeanDefinition对象),注册资源文件(其实就是把BeanDefinition放入到一个final的hashmap中,然后根据依赖关系进行注入),而且这几个过程之间是松耦合的,可以灵活的扩展,定义自己的容器。比如refresh方法是基类中定义的,但是调用的getBeanFactory方法却是抽象的,必须由子类根据自己的特性来实现,这样的设计正符合通过扩展来实现变化的开闭原则,学习了。Ioc容器大概的流程根据自己跳跃的思维过了一遍,发现读起来思路基本上很流畅,注释很详细,也是值得学习的。

还有一些比较细节的地方,有时间再细细研究了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 04:08:56

Spring核心之Ioc容器走读笔记的相关文章

Spring技术内幕——Spring Framework的IOC容器实现(一)

一.SpringIOC容器概述 IOC容器和依赖反转的模式 在面向对象的系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上.这些依赖关系可以通过把对象的依赖注入交给框架IOC容器来完成.他可以再解耦代码的同时提高了代码的可测试性. 依赖控制反转的实现由很多种方式,在Spring中,IOC容器是实现这个模式的载体,他可以再对象生成或者初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖.这种依赖注入是可以递归的,对象被逐

SPRING源码解析-SPRING 核心-IOC

IoC 和 AOP是Spring的核心, 是Spring系统中其他组件模块和应用开发的基础.透过这两个模块的设计和实现可以了解Spring倡导的对企业应用开发所应秉承的思路: 易用性. POJO开发企业应用, 直接依赖于Java语言,而不是容器和框架. 提升程序的可测试性,提高软件质量. 提供一致性编程模型,面向接口的编程 降低应用的负载和框架的侵入性.IoC和AOP实现. 不作为现有解决方案的替代,而是集成现有. IoC和AOP这两个核心组件,特别是IoC容器,使用户在使用Spring完成PO

使用Spring.NET的IoC容器

使用Spring.NET的IoC容器 0. 辅助类库 using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SpringDemo.Pub { public static class Pub { public static string ServiceNameA = "SpringDemo.Lib.Oracle.OracleDatabase"; pub

比Spring简单的IoC容器

比Spring简单的IoC容器 Spring 虽然比起EJB轻量了许多,但是因为它需要兼容许多不同的类库,导致现在Spring还是相当的庞大的,动不动就上40MB的jar包, 而且想要理解Spring的内部运行机制,阅读它的代码非常重要, 但是往往它的代码非常的"多". 现在根据Spring对Bean的生命周期的处理, 编写出一款非常小的IoC容器, 没有了对XML的解析,而是通过对Config对象的构造而完成IoC配置文件的声明, 相比较XML的方式, 对重构软件非常具有好处, 并且

Spring 总览及 IOC 容器的使用 —— Spring 官方文档解读(一)

Spring 总览及 IOC 容器的使用 -- Spring 官方文档解读(一) 什么是 Spring? spring 这个词在不同情况下有不同意义.可以指 Spring 框架本身,但更多地被用来表示 Spring 整个家族的产品. 设计理念 学习框架必须要知道它的设计理念,Spring 框架有着以下的理念: Spring 让你在架构种的各个层面有更多的选择,并且允许你尽晚的做出决策.比如,你在项目完成后可以通过更改配置来切换持久层的提供者. Spring 具有强大的灵活性,它不在意你是如何完成

看完这篇你还敢说,不懂Spring中的IoC容器?

一. 什么是IoC 什么是耦合和内聚 耦合指的就是模块之间的依赖关系.模块间的依赖越多,则表示耦合度越高,相应的维护成本就越高.内聚指的是模块内功能之间的联系.模块内功能的联系越紧密,则表示内聚度越高,模块的职责也就越单一.所以在程序开发中应该尽量的降低耦合,提高内聚.也就是设计原则中的开闭原则和单一职责原则. 工厂模式 工厂模式就是用来解决程序间耦合的一种设计模式.可以把所有要创建的对象放在工厂的一个集合里,当需要使用这个对象的时候,直接从工厂里面取出来用就行. 工厂模式的优点: 一个调用者想

Spring Framework的核心:IOC容器的实现

2.1   Spring IoC容器概述 2.1.1 IoC容器和依赖反转模式 依赖反转的要义,如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测性的降低.依赖控制反转的实现有很多种方式,在Spring中,IoC是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以将对象引用注入到对象数据域中的方式来注入对方法调用的依赖. IoC亦称为“依赖倒置原则”:高层次的模块,不应该依赖与低层次模块,他们都依赖于抽象.抽象不应该依赖于具体的实现,具体实现

好记性不如烂笔头83-spring3学习(4)-spring的BeanFactory(IoC容器)

我们一般把BeanFactory叫做IoC容器,叫ApplicationContext 为应用上下文(或者Spring容器) BeanFactory是spring框架的核心,实现依赖注入[使个组件的依赖关系从代码中独立出来,使用配置文件即可实现这种依赖关系]和bean声明周期的管理 . BeanFactory[IoC容器]启动过程:分为两个阶段,一个是容器启动阶段,另外一个是Bean实例化阶段 容器启动阶段:加载配置 -–> 分析配置信息 -–>装备到BeanDefinition -–>

Spring核心技术之IOC容器(一):IOC容器与Bean简介

最近开始研究Spring框架,今天学习Spring的核心内容IOC 与 Bean 1. Spring IOC 与 Bean 简介  Inversion of Control (IoC)即控制反转,也叫dependency injection (DI)依赖注入,Spring实现了一个基于配置文件的复杂工厂模式来提供实现控制反转. org.springframework.beans 和org.springframework.context包是Spring中实现IOC的基础包,其中BeanFactor