一、摘要

        本文为作者搜集的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. 从零开始编译Poco C++和VS2015环境配置

    Poco C++是一个C++的开源框架,详细介绍可以问百度介绍更详细,这里我就记录下我从零编译poco-1.9.0和配置 VS2015的环境,以备不时之需. 步骤:一.安装cmake: 二.编译poc ...

  2. 最长重复字符串题解 golang

    最长重复字符串题解 package main import ( "fmt" "strings" ) type Index map[int]int type Co ...

  3. 使用腾讯地图和js,html实现地理位置的获取

    转自http://blog.csdn.net/eele_one/article/details/64905218<!DOCTYPE html> <html> <head& ...

  4. Python学习【02】Python基础

    一.Python内部执行过程 1.Python的后缀名可以是任意? print("hello,world")  保存成  .py / .txt / .sb / .aaa 都可以用在 ...

  5. SpringBoot aop 注解 数据权限校验

    注解类: @Retention(RetentionPolicy.RUNTIME) public @interface DataAuthValid { //位置 public int index() d ...

  6. asp源码微信扫码授权登陆电脑版

    网站接入微信扫码登录并获取用户基本信息(完美绕过微信开放平台)电脑版网站实现微信扫码登录,注册会员还要设密码太麻烦,会员也记不住密码,采用微信扫码登录网站更方便,会员无需设密码,用他的微信做为系统登录 ...

  7. 小程序2-基本架构讲解(一)JSON配置与详解

    项目里边生成了不同类型的文件: .json 后缀的 JSON 配置文件 .wxml 后缀的 WXML 模板文件 .wxss 后缀的 WXSS 样式文件 .js 后缀的 JS 脚本逻辑文件 JSON 配 ...

  8. IDEA 倒入maven项目下载很慢

    1.找到安装maven的路径 2.直接搜索settings.xml文件 <mirror> <!--This sends everything else to /public --&g ...

  9. 【安全测试自学】初探web安全处测试(三)

    安全测试专家成长系列之-初探Web安全3.mp4 案例: 安全测试的前景: 总结讨论:

  10. Docker最简教程

    本文旨在让你用最短的时间弄懂Docker命令操作,什么虚拟化都太泛泛了,不讲大道理,实践出真知,让你从此的日常开发和工作中在面对Docker时不再茫然失措而是得心应手.本文也不谈安装,我实在认为作为程 ...