一. IOC和DI基础
IOC-Inversion of Control,译为控制反转,是一种遵循了依赖倒置原则的代码设计思想。
所谓依赖倒置,就是把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层建筑。高层建筑决定需要什么,底层去实现这样的需求,但是高层并不用管底层是怎么实现的。这样就不会出现前面的“牵一发动全身”的情况。
而控制反转就是把传统程序中需要实现对象的创建、代码的依赖,反转给一个专门的"第三方"即容器来实现,即将创建和查找依赖对象的控制权交给容器,由容器将对象进行组合注入,实现对象与对象的松耦合,便于功能的复用,使程序的体系结构更灵活。
DI-Dependency Injection,译为依赖注入,实际上是对Ioc的另一种称呼。2004年,大师级人物Martin Fowler为“控制反转”取了一个更合适的名字“依赖注入”。给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
理解IOC和DI的关键:
控制反转,谁控制了谁?--IOC容器控制了对象;控制了什么?--控制了外部资源的获取(对象,文件等);哪些方面的控制被反转了?--获得依赖对象的过程被反转了。
依赖注入,谁依赖谁?--程序依赖IOC容器;为什么需要依赖?--程序需要IOC容器来提供外部资源;谁注入谁?--IOC容器向程序注入;注入了什么?--注入某个对象所需要的外部资源。
依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
二. Spring容器与Bean 1. spring核心容器spring的核心容器包括了:Beans、Core、Context、SpEL
① core和beans模块提供了整个框架最基础的部分,包括了IOC和DI。
② Context建立在Core和Beans模块提供的基础之上:他提供了框架式访问对象的方式
③ core、beans、context构成了Spring的骨架
④ SpEL:提供了一种强大的用于在运行时操作对象的表达式语言
org.springframework.beans.factory.BeanFactory是Spring容器的实际代表者,容器负责容纳此前所描述的bean,并对bean进行管理。
2. spring与bean的关系Spring容器是Spring的核心,一切SpringBean都存储在Spring容器内。可以说bean是spring核心中的核心。Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息来创建Bean实例,并调用Bean实例的方法来完成“依赖注入”,可以把Spring容器理解成一个大型工厂,Bean就是该工厂的产品,工厂(Spirng容器)里能生产出来什么样的产品(Bean),完全取决于配置文件中的配置。而这个配置是由开发人员创建和维护的。
3. Bean的作用域spring的作用域有singleton,prototype,request,session,globle session。
这里只讨论常用的singleton和prototype两种作用域
对于singleton作用域,每次请求同id的Bean都将获得相同的实例,spring容器负责跟踪Bean实例状态,负责维护Bean实例的生命周期。
对于prototype作用域,程序每次请求同id的Bean会获得新的实例,spring容器只负责创建,一旦创建成功就撒手不管,不再管理Bean实例的生命周期,也不会维护Bean实例的状态。
4. 容器中Bean的生命周期 Spring可以管理singleton作用域Bean的生命周期,Spring可以精确地知道singleton域bean何时被创建,何时初始化完成,以及容器何时准备销毁Bean实例。对于singleton作用域的Bean,管理Bean的生命周期行为主要有两个时机:注入依赖关系后,销毁实例之前;具体的管理方法如下
Spring提供两种方式在Bean全部属性设置成功后执行特定行为
使用init-method 属性(代码污染小)
在类中编写一个方法,在属性中指定该方法在依赖关系设置完成后自动执行。
实现InitializingBean接口(耦合较高)
编写afterPropertiesSet()方法的具体实现
同理,若在Bean销毁之前,执行特定的方法,只需要使用 destroy-method属性或实现DisposableBean接口(实现destroy()方法)
对于prototype作用域的Bean,Spring容器只负责Bean的创建,当容器创建实例完成后,Bean将完全交给客户端代码管理,容器不再负责其生命周期,Spring容器本身也不知道自己创建了多少个实例,更无从知道这些实例什么时候才会被销毁。