Spring的IOC

(1)IOC能做什么?

IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间的高耦合,难于测试;有了IOC容器后,把创建和查找依赖对象的控制权交给容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

其实IOC对编程带来的最大改变不是从代码上的,而是从思想上的,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IOC/DI思想中,应用程序就变成被动的了,被动的等待IOC容器来创建并注入它所需要的资源了。

IOC很好的体现了面向对象设计法则之—好莱坞法则:“别找我们,我们找你”;即由IOC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

  1. IOC和DI

DI-Dependency Injection,即“依赖注入”;组件之间依赖关系由容器在运行期决定,形象的说。即由容器动态的将某个依赖关系注入到组件中。依赖注入的目的并非是为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可拓展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可以指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”。

谁依赖谁:应用程序依赖于IOC容器。

为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源。

谁注入谁:IOC容器注入应用程序某个对象,应用程序依赖的对象。

注入了什么:注入某个对象所需要的外部资源(包括对象,资源,常量数据)

IOC和DI的关系:它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年Martin Fowler又给出了一个新的名字:“依赖注入”,相对IOC而言,“依赖注入”明确描述了“被注入对象依赖IOC容器配置依赖对象”。

容器:储存对象,使用map结构来存储,在Spring中一般存在三级缓存,singletonObjects存放完整的Bean对象,整个Bean的生命周期,从创建到销毁的过程都是容器来管理的。

IOC的实现原理:工作原理、过程、数据结构、流程、设计模式、设计思想。

核心方法:createBeanFactory,getBean,doGetBean,doCreateBean等等

  1. 通过CreateBeanFactory创建一个Bean工程(DefaultListableBeanFactory)
  2. 开始循环创建对象,因为容器中的bean默认是单例的,所以优先通过getBean,doGetBean从容器中查找。
  3. 通过createBean、doGetBean方法,以反射的方式创建对象,一般情况下使用的是无参的构造方法(getDeclaredConstructor,newInstance)。
  4. 进行对象的属性填充(populateBean)
  5. 进行其他的初始化操作(initializingBean)

Spring的生命周期主要包含四个阶段

实例化Bean—>>Bean属性填充—>>初始化Bean—>>销毁Bean

(1)实例化Bean,当客户向容器请求一个尚未初始化的bean时,或初始化bean的时候需要注入另外一个尚未初始化的依赖时,容器就会自动调用doCreateBean方法进行实例化,实际上就是通过反射的方式创建一个bean。

(2)Bean实例创建出来后,接着就是给这个Bean对象进行属性填充,也就是注入这个Bean依赖的其他bean对象。

(3)属性填充完成后,进行初始化Bean操作,初始化又可以分为几个步骤:

1.执行Aware接口的方法:Spring会检测该对象是否实现来了XXXAware接口,通过Aware类型的接口,可以让我们拿到Spring容器的一些资源。如实现BeanNameAware接口可以获取到BeanName,实现BeanFactoryAware接口可以获取到工厂对象BeanFactory等。

2.执行BeanPostProcessor的其那只方法postProcessBeforeinitalization,对bean执行一些自定义的前置处理。

3.判断bean是否实现了initializingBean接口,如果实现了,将会执行initializingBean的afterPropertiesSet()初始化方法。

4.执行用户自定义的初始化方法,如init-method等。

执行BeanPostProcessor的后置处理方法postProcessAfterInitialization()。

(4)初始化完成后,Bean就成功创建了,之后就可以使用这个Bean,当Bean不再需要时,会进行销毁操作。

1.首先判断Bean是否实现了DestructionAwareBeanPostProcessor接口,如果实现了,则会执行DestructionAwareBeanPostProcessor后置处理器的销毁回调方法。

2.其次会判断bean是否实现了DisposableBean接口,如果实现了将会调用其实现的destroy()方法。

3.最后判断这个bean是否配置额destroy-method等自定义的销毁方法,如果有的话,则会自动调用其配置的销毁方法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值