一、摘要

        本文为作者搜集的Spring关于IoC/DI相关知识的记录整理笔记。介绍了IoC(控制反转)是一种设计原则,用于降低代码的耦合度。介绍了IoC是通过BeanDefinition来定义Bean对象及其关系,用BeanFactory来管理Bean的生命周期。
 

二、什么是IoC/DI

        IoC,全称Inversion of Control,控制反转,是面向对象编程中的一种设计原则,这种设计可以减低计算机代码之间的耦合度。
        通过IoC,对象在创建的时候,就不需要调用方用new的方式来创建实例,而是由外部系统创建对象实例,并把对象引用传递给调用方。
        IoC的实现方式有DI(Dependency Injection,依赖注入)和DL(Dependency Lookup,依赖查找),其中在Spring中DI就是由Spring框架负责创建实例,并把注入到调用方对象中,如图1。
(图1、IoC示意图)
 

三、Spring IoC体系结构

        IoC容器用来完成对象的创建和依赖管理,对象和对象关系可以使用XML文件、注解来描述。
        Spring框架中,对象的创建可以看BeanFactory,对象及其关系的定义可以看BeanDefinition。

1、BeanFactory

(图2、BeanFactory类继承图)
 
        这是一个工厂模式,BeanFactory对IoC基本容器的基本行为作了定义,但不负责实现。Spring提供了若干个IoC容器的,有:XmlBeanFactory、ClassPathXmlApplicationContext
        BeanFactory定义了Spring Bean获取及其相关的方法,如下:
        getBean – 根据Bean名称或类对象获取Bean实例
        getAliases – 根据Bean名称获取别名列表
        getType – 根据Bean名称获取Bean类对象
        isPrototype – 判断Bean是否属于原型模式
        isSingleton – 判断Bean是否属于单例模式
        isTypeMatch – 判断类对象是否与Bean类型匹配上

2、BeanDefinition

        BeanDefinition是用来定义Bean的一个接口,是Bean对象的抽象数据结构,其包括了构造器参数、属性参数以及其它具体的参数。
 

四、IoC容器的初始化及Bean的作用域及其生命周期

1、IoC容器的初始化

        三个基本过程:资源定位、载入、注册;
        (1)Resource定位:Bean的定义文件定位
        (2)载入:将Resource定位好的资源载入到BeanDefinition
        (3)注册:将BeanDefinition注册到容器中
        Spring会将资源定位成为Resource对象,BeanDefinition会读取Resource形成BeanDefinition对象。最终BeanDefinition会和beanName、Alias一同封装到BeanDefinitionHolder类中,注册到BeanFactory的实现类(DefaultListtableBeanFactory.beanDefinitionMap)中。
        Spring容器会根据注册的BeanDefinition信息将Bean进行实例化。

2、Bean的生命周期

        这里讲Bean的生命周期,了解Bean的生命周期,可以根据自己的需要,在不同阶段做一些定制处理。
        Bean的生命周期线索:实例化、初始化、使用、销毁
 
        示意图:
(图3、Bean的生命周期)
 
        具体如下:
        — 实例化 —
        (1)Bean实例化
 
        — 初始化 —(各种Aware接口)
        (2)属性注入
        (3)设置Bean的名称(BeanNameAware.setBeanFactory())
        描述:如果Bean实现了BeanNameAware接口,工厂会调用该方法传递Bean的ID
        (4)设置BeanFactory?(BeanFactoryAware.setBeanFactory)
        描述:如果Bean实现了BeanFactoryAware接口,工厂会调用该方法传递工厂本身
        (5)调用BeanPostProcessor前置处理方法(BeanPostProcessor.postProcessBeforeInitialization())
        描述:如果有BeanPostProcessor和该Bean关联(注意是关联,即不需要该Bean去实现BeanPostProcessor接口),则postProcessBeforeInitialization会被调用
        用途:1、进行AB测试时,可以在此处做路由;2、进行密文转明文处理;
        (6)调用属性设置后置处理方法(InitializingBean.afterPropertiesSet())
        描述:如果Bean实现了InitializingBean接口,工厂会执行afterPropertiesSet方法内容
        (7)调用定制的初始化方法(init-method属性)
        描述:执行Bean的init-method属性定义的方法
        (8)调用BeanPostProcessor后置处理方法(BeanPostProcessor.postProcessAfterInitialization())
        描述:如果有BeanPostProcessor和该Bean关联(同(5)),则postProcessAfterInitialization会被调用
 
        — 使用 —
        (9)这一步Bean已经可以被使用了,如果容器被关闭,则继续下一步
 
        — 销毁 —
        (10)调用方法DisposableBean.destroy()
        描述:如果Bean实现了DisposableBean接口,则destroy方法会被调用
        (11)调用定制的销毁方法(destroy-method)
        描述:执行Bean的destroy-method属性定义的方法

3、Bean的作用域

        Bean由IoC容器进行管理的对象,每个作用域的总结如下:
类别
说明
应用
singleton
默认为单例模式,在Spring IoC容器中仅存在一个Bean实例。
无状态Bean
prototype
每次从容器中调用Bean,都返回一个新的实例。
有状态Bean
request
每次Http请求都会创建一个新的Bean(仅限WebApplicationContext环境)
创建的Bean仅当前Http请求有效。
session
Http Session共享一个Bean(仅限WebApplicationContext环境)
创建的Bean仅当前Http Session有效。
globalSession
一般用于Portlet应用环境(仅限WebApplicationContext环境)
不知道有什么鬼用
 

五、总结

        1、IoC是一种设计原则,能降低代码耦合度,由IoC容器负责Bean的创建并提供给调用者使用,其实现方式是DI,依赖注入;
        2、BeanDefinition保存Bean的元数据信息,是用来定义Bean及其之间的关系;
        3、BeanFactory负责Bean的创建和销毁,管理Bean的生命周期;
        4、Bean的生命周期线索为:实例化、初始化、使用、销毁;
        5、Bean的作用域有:singleton、prototype、request、session、globalSession;
 
参考资料:

Spring:Ioc和DI的更多相关文章

  1. Spring IoC 和 DI 简介(二)

    Spring IoC 和 DI 简介 IoC:Inverse of Control(控制反转) 读作“反转控制”,更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控制权,交由 ...

  2. Spring 学习教程(一):浅谈对Spring IOC以及DI的理解

    一.个人对IoC(控制反转)和DI(依赖注入)的理解我们平时在开发java web程序的时候,每个对象在需要使用它的合作对象时,自己都要将它要合作对象创建出来(比如 new 对象),这个合作对象是由自 ...

  3. Spring IOC(DI)

    软件152 余建强 1 什么是IOC IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不 ...

  4. (转)spring IOC、DI理解

    转自: http://www.cnblogs.com/xdp-gacl/p/4249939.html 个人理解: IOC控制反转,反转的是获取依赖对象的方式.传统的应用在存在依赖关系时,比如A依赖于B ...

  5. 对Spring Ioc 以及DI的精彩理解

    转:http://blog.csdn.net/cyjs1988/article/details/50352916 学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注 ...

  6. Spring IoC与DI(依赖注入)

    Spring Ioc 所谓控制反转,即将传统的需要代码进行的操作,交由Spring容器来做.下面以添加book为例进行比较一下: BookService.java public interface B ...

  7. 利用递归,反射,注解等,手写Spring Ioc和Di 底层(分分钟喷倒面试官)了解一下

    再我们现在项目中Spring框架是目前各大公司必不可少的技术,而大家都知道去怎么使用Spring ,但是有很多人都不知道SpringIoc底层是如何工作的,而一个开发人员知道他的源码,底层工作原理,对 ...

  8. Spring|IOC与DI

    一.IOC IOC(Inversion of Control),控制反转,是Spring的核心内容之一. 什么是“控制反转”? [示例] package com.my; /** * @Author j ...

  9. Spring基础03——Spring IOC和DI概述

    1.什么是IOC与DI IOC(Inversion of Control):其思想是反转资源获取方向,传统的资源查找方式要求组件想容器发起请求查找资源,作为回应,容器适时的返回资源,而应用了IOC之后 ...

  10. Spring IoC、DI入门小程序

    Alt+/智能提示xml配置文件节点及属性:在接口上使用Ctrl+T可以提示其实现类 一.IoC控制反转(将创建对象的权利交给spring)入门小程序 1.引入jar包 2.工程基本结构 3.新建Us ...

随机推荐

  1. C# 6.0:nameof操作符

    C# 6.0 引入了一个名为“nameof”的新的操作符,它的作用是接收元素而后返回元素名字.这个操作符能将class和class的所用成员,比如方法.变量以及属性作为参数而后返回一个它们的名字.这避 ...

  2. yolo v2使用总结

    以下都是基于yolo v2版本的,对于现在的v3版本,可以先clone下来,再git checkout回v2版本. 玩了三四个月的yolo后发现数值相当不稳定,yolo只能用来小打小闹了. v2训练的 ...

  3. ubuntu16.04 pip install scrapy 报错处理

    Failed building wheel for Twisted inculde/site/python3./Twisted failed with error code in tmp/pip-in ...

  4. 从9x9矩阵中抽取中间菱形区域打印 - perl

    起因: 源自于c的练习题,打印diamond,因为perl不需编译,方便调试,故先用perl实现一下 关键: 没有想到好的思路,只能借助于上一篇打印上下三角矩阵的方法,把菱形拆成上下左右4个三角矩阵区 ...

  5. Windows编程1

    一个最简单的windows必须包括两个函数: 1.入口函数:WinMain 2.窗口过程回调函数:WndProc 结构如下: #include <windows.h> //窗口过程回调函数 ...

  6. dis集群研究和实践(基于redis 3.0.5) 《转载》

    https://www.cnblogs.com/wxd0108/p/5798498.html 前言 redis 是我们目前大规模使用的缓存中间件,由于它强大高效而又便捷的功能,得到了广泛的使用.现在的 ...

  7. c#+cad2010+MQ接收消息

    cad2015+版本可以使用TrayItem气泡显示消息 static TrayItem trayItem = new TrayItem(); public static void testtrayi ...

  8. Memcache,redis,rabbitMQ,SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  9. 三、CSS样式——列表

    概念: CSS列表属性允许你放置.改变列表标志,或者将图像作为列表项标志 属性 描述 list-style 简写列表项 list-style-image 列表项图像 list-style-positi ...

  10. LinuxMint 下 B站 番 blv 缓存 转 mp4

    参考https://www.littleqiu.net/archives/886 (不过我使用绝对路径,ffmpeg报错,相对路径没问题) 一.安装ffmpge sudo apt-get instal ...