Spring之IOC

Spring有两个核心框架:IOC和AOP。

Spring其他非常强大的应用程序,它们是基于IOC和AOP发育。

今天,我们来聊一聊IOC。

关于IOC,网上有非常多精彩的文章介绍,我先给大家推荐几篇对IOC理解比較好的文章:

从生活中看SpringIOC原理

Spring IOC原理解析

大家在网上搜IOC,一定会找到DI的概念,事实上IOC与DI讲的是一个意思,他们仅仅是从两个角度描写叙述了Spring IOC容器管理对象依赖关系。

IOC控制反转:说的是创建对象实例的控制权从代码空值剥离到IOC容器控制,实际就是你的xml文件控制,側重于原理。

DI依赖注入:说的是创建对象实例时,为这个对象注入属性值或其他对象实例,側重实现。


本来是由应用程序管理的对象之间的依赖关系,如今交给容器管理,这就叫组控制反转。即交给了IOC容器。Spring的IOC容器主要使用DI方式实现的。不须要主动查找。对象的查找、定位和创建所有交给容器管理。

1、大量降低了Factory和Singleton的数量。使代码层次更加清晰。主要原因是我们不再查找、定位、创建和管理对象之间的依赖关系了,都交给IOC容器管理了。

2、Spring的IOC容器是一个轻量级的容器。没有侵入性,不须要依赖http://write.blog.csdn.net/postedit容器的API,也不须要实现一些特殊接口。

3、更好的管理管理java对象,更好的面向接口编程。

4、解耦合,将耦合推迟到配置文件里,发生变化也更加容器控制。


总之。就是一句话:类之间的依赖关系。不再由类自己去负责。而是由容器依据配置文件去创建实例,并维护各个实例之间的依赖关系。


DI依赖注入是一个非常大的概念。它有两种类型依赖注入(Dependency Injection)和依赖查找(Dependency Lookup)。

依赖注入:Spring就是採用的依赖注入。组件不做定位查询。仅仅是提供普通的Java方法,让容器去读取配置文件,决定依赖关系。容器全全负责组件的装配,它把符合依赖关系的对象通过JavaBean属性或者构造子传递给须要的对象。

通过JavaBean属性注入依赖关系的做法叫做设置方法注入(Setter Inection);将依赖关系作为构造子參数传入的做法叫做构造子注入(Constructor Inection)。

所说的也就是Spring中的两种依赖注入的方式:setter方法注入、构造方法注入。


依赖查找:容器给组件提供回调接口和上下文环境。

Ejb和Spring都能够使用这样的方式获取Bean。



那么Spring是如何实现控制反转、依赖注入的呢?

无非就是工厂模式+反射的综合运用。之前。我写过一篇文章:Java中通过dom4j读取配置文件实现抽象工厂+反射,简答模拟了Spring IOC的内部实现。基本思路实现:

1、将类之间的依赖关系配置在配置文件里,并遵循一定的约定,如:每个bean标签中id为接口,class为对象实现。

2、然后使用dom4j读取该配置文件。并利用反射,得到对应的对象。

3、然后将得到的对象以键值对的形式保存在Map中。key为接口,value为该接口的实现类的对应对象。

这样,就通过工厂,完毕了轻量级的对象创建。模拟了Spring IOC容器对Bean的创建过程。


当然,在Spring 的IOC的实现中。提供了要比这个更加复杂的实现。

Spring IOC中。提供了两种实现方式:配置文件和注解。

拿Spring的setter方式注入举例,Spring通过约定大于配置,截取set方法名称,进行匹配注入,也就是Bean的定位查找。然后採用工厂的方式创建bean。

Spring通过ApplicationContext装在Bean的定义,并把它们组装起来。

关于Spring IOC容器的详细实现,大家能够到牛人那里看他自己封装的IOC:自己动手开发IOC容器


总结

本文没有解说Spring在项目中的应用,也没有讲Spring的配置方式。本文环绕Spring IOC,谈到自己的IOC理解力。以及IOC排序实现。为了帮助理解。

版权声明:本文博主原创文章,博客,未经同意不得转载。

原文地址:https://www.cnblogs.com/zfyouxi/p/4808049.html