Spring的学习笔记一(Spring Framework的核心:IOC容器的实现)

#Spring IOC的概述
1.1.1 依赖反转是什么呢?

如果合作对象的引用或依赖关系的管理有具体对象来完成,会导致代码的高度耦合和可测试性的降低。我们以前就是这样干的,大家可以想象我们创建的类B要调用类A中的a方法我们是如何干的呢?
因为很多对象依赖关系的建立和维护不需要和系统运行状态有很强的关联性,所以可以把在面向对象编程中需要执行的诸如新建对象、为对象引用赋值等操作交由容器统一完成。

1.1.2Spring IOC的应用场景

解耦的利器
在spring中SpringIOC提供了一个基本的JavaBean容器,通过IOC模式管理依赖关系并通过依赖注入和AOP切面增强了为JavaBean这样的POJO容器对象赋予事务的管理,声明周期管理等功能;

注入方式

  • 接口注入
  • setter注入
  • 构造器注入

2.1 IOC容器系列的设计与实现:BeanFactory和ApplicationContext

BeanFactory:简单容器系列,只实现了容器的最基本的功能
ApplicationContext:应用上下文,容器的高级形态而存在;他作为容器的高级形态而存在,应用上下文在简单容器的基础上,增加了许多现象框架的特征,同时对应用环境做了许多的适配;

2.2.1 Spring的IOC容器系列

  1. 我们通常所说的IOC容器,实际上代表的就是着一系列功能各异的容器产品,只是容器的工能有大有小,各自有各自的特点;

  2. BeanDefinition:管理spring的应用中的各种对象以及它们之间的相互依赖关系

  3. IOC是用来管理对象的依赖关系的,对IOC容器来说,BeanDefinition就是对依赖反转模式中管理的对象依赖关系的数据抽象们也是容器实现依赖反转的核心数据结构,依赖反转功能都是围绕这个BeanDefinition的处理来实现的。

2.2.2 Spring IOC 容器的设计
IOC容器接口设计图
接口的两条设计主线

  1. 从接口BeanFactory到HierarchicalBeanFactory,再到ConfigurableBeanFactory
  2. 以ApplicationContext应用上下文接口为核心的接口设

BeanFactory

  1. BeanFactory的应用场景:

BeanFactory提供的是最基本的IOC容器功能,它只是一个接口类,并没有给出容器的具体实现,而DefaultListableBeanFactory、XmlBeanFactory、ApplicationContext等都可以看做是容器附加了某种功能的具体实现,也就是容器体系中具体的容器产品。

BeanFactory和FactoryBean:

  1. 在spring中所有的bean都是由BeanFactory(IOC 容器)来管理的;
  2. FactoryBean是一个能生产或者修饰对象的工厂bean,它的实现与设计模式中的工厂模式和装饰者模式有关
  3. BeanFactory接口设计了getBean方法,这个方法是使用IOC容器API的主要方法,可以取得IOC容器中管理的Bean,Bean的取得是通过指定名字来索引的
  • BeanFactory容器的设计原理:XmlBeanFactoy设计的类继承关系

BeanFactory只提供最基本的IOC容器功能,而XMLBeanFactory是实现IOC容器的高级表现形式

  • 可以看到XMLBeanFactory继承自DefaultListableBeanFactory这个类;

DefaultListableBeanFactory实际上包含了基本IOC容器所具有的重要功能,在设计应用上下文ApplicationContext的时候就会用到它;
在spring中实际上把DefaultListableBeanFactory作为一个默认的功能完整的IOC容器来使用的;

  • 从XMLBeanFactory的名字我们能猜到它是一个可以读取xml文件的BeanFactory,但其实它对xml文件定义信息的处理是通过一个XMLBeanDefinitionReader对象来完成的;
  • 构造XMLBeanFactory这个IOC容器时,需要指定BeanDefinition的信息来源,而这个信息来源需要封装成spring的Resource类来给出;

在使用IOC容器时,需要注意如下几个步骤:

  1. 创建IOC配置文件的抽象资源,这个抽象资源包含了BeanDefinition的定义信息;
  2. 创建一个BeanFactory,这里使用DefaultListableBeanFactory;
  3. 创建一个载入BeanDefinition的读取器,这里使用的是XMLBeanDefinitionReader来载入xml文件形式的BeanDefinition,通过一个回调配置给BeanFactory;
  4. 从定义好的资源配置位置读入配置信息,具体解析的过程有XmlBeanDefinitionReader来完成。完成整个载入和注册Bean定义之后,需要的IOC容器就建立起来了。

ApplicationContext

  1. ApplicationContext的应用场景

ApplicationContext提供了BeanFactory所不具备的几个特性

  1. 支持不同的信息源:扩展了messageSource接口,支持国际化
  2. 访问资源:对ResourceLoader和Resource的支持上。我们可以从不同的地方得到Bean定义资源
  3. 支持应用事件:这些事件和bean的声明周期的结合为bean的管理提供了便利
  4. 在ApplicationContext中提供附加的服务
  1. ApplicationContext容器的设计原理

2.3IOC容器的初始化过程

refresh()方法,这个方法标志IOC容器正式启动;
具体的来说这个启动包含了BeanDefinition和Resource的定位、载入、注册这三个基本过程,在spring中这三个过程的实现是分开的,通过不同的模块来完成;

  1. Resource定位过程,既BeanDefinition 的资源定位
  2. BeanDefinition的载入,把用户封装好的Bean表示成IOC容器的内部的数据结构;这个容器的内部数据结构就是BeanDefinition,而这个BeanDefinition实际就是POJO对象在IOC容器中的抽象;
  3. 向IOC容器注册这些BeanDefinition的过程,调用BeanDefinitionRegistry接口实现来完成的,在IOC内部将BeanDefinition注入到一个hashmap中去,IOC容器就是通过这个hashmap来持有这些BeanDefinition数据的;

特别注意

  1. 上面说的是IOC容器的初始化过程,在这个过程并不包含bean依赖注入的实现;
  2. 在spring IOC中 bean定义的载入和依赖注入是两个独立过程
    ① 依赖注入一般发生在应用第一次通过getBean向容器索取bean的时候,
    ②有一个例外需要特别注意:
    如果对某个属性设置了lazyinit属性,如果设置了这个属性那么这个Bean的依赖注入在IOC容器初始化得时候就预先完成了,而不需要等到IOC容器初始化完成以后,在第一次调用getBean的时候再去初始化;
  1. BeanDefinition的载入和解析
  2. BeanDefinition在IOC容器中注册

2.4 IOC容器的依赖注入
2.5 容器的其他相关特性的设计和实现

  1. ApplicationContext和Bean的初始化以及销毁
  2. lazy-init属性和预实例化
  3. FactoryBean的实现
  4. BeanPostprocessor的实现
  5. autowiring自动装配的实现
  6. Bean的依赖检查
  7. Bean对IOC容器的感知
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值