一、摘要

        本文为作者搜集的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. 《剑指offer(第二版)》面试题60——n个骰子的点数

    一.题目描述 把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率. 二.题解 <剑指offer>上给出的两种方法,尤其是代码,晦涩难懂且没有注释 ...

  2. Apartment 2019:(1)创建墙体

    墙体建模 The Walls 软件:SketchUp Pro 2017 墙体模型 建模过程: 一.导入图像并调整大小 导入公寓平面参考图/户型图(来自网络),导入为图像.连续三击鼠标左键,选中所有的几 ...

  3. Linux基础之常用命令整理(二)

    Linux系统启动流程 bios(找到启动介质) --> mbr(找到boot loader  512B 446引导信息 64分区信息 2 标志位 ) -->grub(选择操作系统或者内核 ...

  4. idea启动tomcat 找不到 类,或者报Error configuring application listener of class org.springframework.web.context.ContextLoaderListener

    这主要是打成war包的时候没有讲导入的jar也添加进去,只需要添加进来就行啦 可以看到WEB-INF目录下没有lib目录 put into output root 就可以了 然后就可以啦

  5. 淘宝App直播宝贝数据采集

    淘宝App直播宝贝数据采集   前段时间,有人问我关于淘宝app直播频道宝贝如何采集?我尝试了下可以获取的到,模拟器登录不了淘宝,这里有一个坑就是,模拟器有时候会跳到登录页面,登录不了淘宝: 一.用A ...

  6. udt的java实现

    udt协议是什么? 我就不回答了,可以网上搜索,一直都是c++的,java的实现已经很久没有修改了 经过测试,java版本有些一问题,现在已经将其修复,已经上传到csdn 另外自己根据实际的应用,再次 ...

  7. js实现输入某串数字,构建完全二叉树,并判断是否为二叉搜索树

    思路:若为二叉搜索树,则中序遍历为递增的 let arr = [15,8,16,6,10];let pindex = [];function Node(){ this.root = null; thi ...

  8. Python-Thread(通俗易懂)

    此类表示在单独的控制线程中运行的活动,有两种方法可以指定该活动,一是将可调用对象传递给构造函数,二是通过覆盖子类中的run()方法. 如果你对线程不太理解,我们可以打个比方,把线程数看作车辆数,我们来 ...

  9. windows文件名格式的中文+数字混合字符串排序

    记录一下 [DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] private static extern int StrCm ...

  10. 关于jfinal发送邮件走过的坑

    最近接到一个写发送邮件的功能开发,使用的是jfinal框架.原本打算使用javamail一步步来的,后来看到jfinal有自带的发邮件的插件(jfinal-mail-plugin),只需两三行代码便可 ...