一、摘要
本文为作者搜集的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;