一、摘要

        本文为作者搜集的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. 20175227张雪莹 2018-2019-2 《Java程序设计》第九周学习总结

    20175227张雪莹 2018-2019-2 <Java程序设计>第九周学习总结 教材学习内容总结 第十一章 JDBC数据库操作 MySQL数据库管理系统 下载安装MySQL 若下载的是 ...

  2. Kong(v1.0.2)认证

    介绍 上游服务(api或微服务)的流量通常由各种Kong的authentication plugins的应用程序和配置控制.由于Kong的服务实体表示您自己的上游服务的一对一映射,所以最简单的场景是在 ...

  3. Jmeter发送邮件功能SMTP Sampler

    介绍Jmeter的发送邮件功能,使用的Sampler是SMTP Sampler,详细说明每个配置项的功能 从上往下介绍需要用到的配置项: Server settings Server: 服务器地址 P ...

  4. 微信小程序是怎么运行的?

    微信客户端在打开小程序之前,会把整个小程序的代码包下载到本地. 紧接着通过 app.json 的 pages 字段就可以知道你当前小程序的所有页面路径 而写在 pages 字段的第一个页面就是这个小程 ...

  5. axios与vue的配合使用事例,实现缓存和重复加载的控制

    import Vue from "vue"; import qs from "qs"; import Store from "../vuex/stor ...

  6. MyEclipse2015优化

    < MyEclipse 2015优化七步法<亲测有效> > l  去除无需加载的模块 Window --> Preferences -->General --> ...

  7. Android自定义万能Canvas画布

    一.需求: 1.在自定义的画布中实现可缩放手势,摇一摇可对控件进行整理排序: 2.画布中可以添加位置设定的控件,控件可以响应点击.长按.拖动事件: 3.控件A长按事件会隐藏画布中的控件除了A之外,显示 ...

  8. 特殊字符的过滤,防止xss攻击

    概念 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允 ...

  9. H5使用codovar插件实现支付宝支付(支付宝APP支付模式,前端)

    H5打包的app实现支付及支付宝支付,本章主要详解支付宝支付,微信支付请查看另一篇“H5使用codovar插件实现微信支付(微信APP支付模式,前端)” ps:本文只试用H5开发的,支付宝 APP支付 ...

  10. java面试题复习(八)

    71.如何通过反射创建对象? 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()  方法2:通过类对象的getConstructor()或 ...