Spring IoC容器总结(未完)

  在面向对象系统中,对象封装了数据和对数据的处理,对象的依赖关系常常体现在对数据和方法的依赖上。这些依赖关系可以通过把对象的依赖注入交给框架或IOC容器来完成,这种从具体对象手中交出控制的做法是非常有价值的,它可以在解耦代码的同时提高代码的可测试性。

  在Spring中,IoC容器是实现这个模式的载体,它可以在对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入对方法调用的依赖。setter注入和构造器注入是主要的注入方式。

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

  1、从接口BeanFactoryHierarchicalBeanFactory,再到ConfigurableBeanFactory,是一个主要的BeanFactory设计路径。这个接口定义中,包括了getBean()这样的IOC容器的基本方法,通过这个方法可以从容器中取得Bean。ConfigurableBeanFactory接口中,主要定义了一些对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IoC容器,通过addBeanPostProcessor配置Bean后置处理等等。

  2、以ApplicationContext应用上下文为核心的接口设计,主要接口设计有,从BeanFactory到ListableBeanFactory,再到ApplicationContext,再到我们常用的WebApplicationContext或者ConfigurableApplicationContext接口。我们常用的应用上下文基本上都是ConfigurableApplicationConntext或者WebApplicationContext的实现。

  BeanFactory接口设计了getBean方法,这个方法是使用IoC容器API的主要方法,通过这个方法,可以取得IoC容器中管理的Bean。如果需要在获取Bean时对Bean进行类型检查,则可用带参数的方法。Object getBean(String name,Class requiredType);

  接口清单:

那么Spring中XML的读取功能是怎样实现的呢?

  构造XmlBeanFactory这个IoC容器时,需要指定BeanDefinition的信息来源,而这个信息来源需要封装成Spring中的Resource类来给出。Resource类是Spring用来封装I/O操作的类。

  IoC容器的初始化过程

      IoC的启动包括BeanDefinition的Resource定位、注入和注册三个基本过程。

  第一个过程是Resource定位过程。这个Resource定位指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成。

  第二个过程是BeanDefinition的载入。这个载入过程是把用户定义好的Bean表示成IoC容器内部的数据结构,而这个容器内部的数据结构就是BeanDefinition。

  第三个过程是向IoC容器注册这些BeanDefinition的过程。在IoC容器内部将BeanDefinition注入到一个HashMap中去,IoC容器就是通过这个HashMap来持有这些BeanDefinition数据的。

  Spring IoC的设计中,Bean定义的载入和依赖注入是两个独立的过程。依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候。但有个例外,就像我们向某个Bean设置了lazyinit属性,那么这个Bean的依赖注入在IoC容器初始化时就预先完成了,而不需要等到整个初始化完成以后,第一次使用getBean时才会触发。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏技术碎碎念

浅谈对Spring Framework的认识

       Spring Framework,作为一个应用框架,官方的介绍如下:        The Spring Framework provides a...

3086
来自专栏冷冷

Spring 必知概念(二)

13、Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要...

2149
来自专栏Android先生

这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解) - 简书

步骤1:添加Retrofit库的依赖 步骤2:创建 接收服务器返回数据 的类 步骤3:创建 用于描述网络请求 的接口 步骤4:创建 Retrofit 实例 步骤...

3416
来自专栏无题

Spring IOC源码解析

SpringIoC模块是IOC模式的一种实现,IoC容器把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,降低了组件之间的耦合度。 SpringI...

4185
来自专栏XAI

SpringMVC+MongoDB+Maven整合(微信回调Oauth授权)

个人小程序。里面是基于百度大脑 腾讯优图做的人脸检测。是关于人工智能的哦。 2017年第一篇自己在工作中的总结文档。土豪可以打赏哦。 https://git.o...

8897
来自专栏JAVA高级架构

Spring 知识点提炼

1. Spring框架的作用 轻量:Spring是轻量级的,基本的版本大小为2MB 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,...

4019
来自专栏Winter漫聊技术

初学Dagger之Hello Dagger(0)

写作背景 这几天在学习Dagger、MVP、Agera,这里所说的Dagger即Google接手的Dagger,也被称作Dagger 2。跟着demo与一些技...

792
来自专栏扎心了老铁

zookeeper curator使用caches实现各种监听

1、篇首语 curator是zookeeper的一个高级api开发包。封装了zookeeper众多的recipes,并且实现了一些新的recipes原语,最重要...

5605
来自专栏Java成神之路

Spring_总结_02_依赖注入

在上一节中,我们了解了Spring的最根本使命、四大原则、六大模块以及Spring的生态。

834
来自专栏ImportSource

像Spring Boot那样创建一个你自己的Starter

如果你所在的公司要开发一个共享的lib,或者如果你想要为开源世界做点贡献,你也许想要开发你自己的自定义的自动配置类以及你自己的starter pom。这些自动配...

3529

扫码关注云+社区

领取腾讯云代金券