一、摘要

        本文为作者搜集的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. 必做课下作业MyCP

    20175227张雪莹 2018-2019-2 <Java程序设计> 必做课下作业MyCP 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP支 ...

  2. [UE4]瞬移前后屏幕亮度变化,Get Player Camera Manager.Start Camera Fade

    From Alpha:开始的颜色透明度 To Alpha:结束的颜色透明度 Duration:过渡所使用的时间(单位:秒) Color:屏幕变化的颜色 Hold when finished:过渡时间结 ...

  3. 1、Netty 实战入门详解

    一.Netty 简介 Netty 是基于 Java NIO 的异步事件驱动的网络应用框架,使用 Netty 可以快速开发网络应用,Netty 提供了高层次的抽象来简化 TCP 和 UDP 服务器的编程 ...

  4. js 合并多行表格

    最近在整理之前的工作记录,有很多信息是借鉴他人,亲测有效的,遗憾的是当初记录时没有留下来源,如侵权请联系fourOfour@163.com. 1.autoRowSpan函数的第一个参数是table的i ...

  5. C# 创建Datatable 并插入数据

    DataTable dt_temp = new DataTable(); dt_temp.Columns.Add("id"); dt_temp.Columns.Add(" ...

  6. 修改Linux主机名

    如果安装时没有设置,一般默认主机名为localhost.localdomain. 通过以下方式修改成自己设置的主机名: 1. vi /etc/sysconfig/network NETWORKING= ...

  7. Garbage-Only-One的IO路

    我的任务计划 刷题计划 BZOJ 1.1202 2.1008 3.等等 搜索 1.搜索题单 学习计划 树 1.树状数组or树状数组or树状数组 2.线段树 搜索 1.A*

  8. Python for循环之图像练习

    矩形 # 控制行 for i in range(1,5): # 控制列 for j in range(1,8): # 用end在末尾传入空格串,这样print函数就不会自动换行了 print('*', ...

  9. 关于Chrome 67 以后版本无法离线安装扩展的解决方法

    升级了Chrome,突然发现扩展管理页面有问题—— 无法离线安装扩展,拖拽crx文件至该页面,Chrome竟然一直提示“无法从该网站添加应用,扩展程序和用户脚本”. 如图: 谷歌自Chrome 67版 ...

  10. [java,2019-01-15] word转pdf

    word转pdf jar包 <dependency> <groupId>org.docx4j</groupId> <artifactId>docx4j& ...