欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring:Ioc和DI

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

一、摘要

        本文为作者搜集的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。
Spring:Ioc和DI
(图1、ioc示意图)
 

三、spring ioc体系结构

        ioc容器用来完成对象的创建和依赖管理,对象和对象关系可以使用xml文件、注解来描述。
        spring框架中,对象的创建可以看beanfactory,对象及其关系的定义可以看beandefinition。

        1、beanfactory

Spring:Ioc和DI
(图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的生命周期线索:实例化、初始化、使用、销毁
 
        示意图:
Spring:Ioc和DI
(图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;
 
参考资料: