spring的ioc与注入

来源:互联网 发布:淘宝客服注意事项 编辑:程序博客网 时间:2024/06/04 20:08

上篇提到了spring的aop,既然讲了spring的一大特点,今天乘着周六有时间就把另一大特点控制反转与依赖注入讲讲。主要讲一些原理概念性的东西,具体的代码实现就不讲了,写给没事就探索深究的小白,嘻嘻。

首先,spring最核心,最基础的概念是什么?将spring类比java,java最核心,最基础的概念就是object了。java中,所有的操作都是针对object的(基础类型除外),java中,一切皆对象,一切都是object。类比下来,spring中最基础的概念是bean。在spring中,所以的类都可以认为是一个bean。在spring中的所有文件,都可以认为是注册了的bean和未注册的bean。 spring中所有操作都是针对bean的操作。自然,spring的三大核心思想中操作的对象,也是bean。

这段话将的还是很有道理的,即用spring操作,不管是xml还是注解形式,我们操作的单元都是bean对象。

Control:控制,即所有的程序都有我们的硬编码来控制,放在java中来看的话,就是我们的一个类test1需要另一个类test2中的方法时,只能在test1的类中实例化test2来调用其方法,test1与test2耦合的非常紧密,若是需要换成test3类中的方法时,只能改变代码,将test2删去,将test3实例化,加进去。这个”控制“的意思,就是在程序运行时,调用test1实例时,即会实例化test2和test3。
IOC:inverse of Control:控制反转。意思是程序中的之间的关系,不用代码控制,而完全是由容器来控制。在运行阶段,容器会根据配置信息直接把他们的关系注入到组件中。说白了就是:在xml中配置好这些关系后,系统启动时容器即会自动将test2和test3的实例注入到test1中,即”控制反转“,由容器控制。
同样,这也是依赖注入的含义。依赖注入和控制反转其实是一个概念。只不过强调的不同而已,依赖注入强调关系的注入是由容器在运行时完成,而控制反转强调关系是由容器控制。其实本质是一样的。

控制反转:我们在使用一个类型的实例实现某个功能时,需要先new出该类型的一个实例,并赋值给我们声明的某个引用变量,这样我们才能够使用该变量进行操作。而new和赋值本事我们自己的权限,此处便是将该控制权限反转交给了spring。

 依赖注入:某个类型要完成一个功能往往需要其他类型的变量来完成,我们在程序中往往通过自己new的方式来完成这个需求,而在spring中,它会帮助我们将这种装配的功能实现,这便是依赖注入。

其中依赖注入包括三种:一种赋值注入(使用getter和setter方法);另一种使用构造器注入,还有一种方法是接口注入。
看程序中student中的ID,name都是使用get,set来赋值的:那在配置文件是如下配置:

 <property name="id"      value="001"/> <property name="name" value="张三"/>

并且Student中的school属性是School类型,则在容器中是如下配置的:

 <property name="school"  ref ="school"/>

而在程序中的School中的name是构造器赋值的,则容器中是如下配置的:

<constructor-arg index="0">         <value>廊坊师院</value></constructor-arg>

构造器中一个参数,则索引值是从0开始,若是有多个,依次递增。
若构造器中的是一个类,则使用bean标签

     <constructor-arg index="0">        <bean class="具体的类">     </constructor-arg>  

接口注入就不用细说了,用的时候就自然理解了。

使用IoC的好处:

(1).可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。代码中的每一个Class都可以单独测试,彼此之间互不影响,只要保证自身的功能无误即可,这就是组件之间低耦合或者无耦合带来的好处。

(2).每个开发团队的成员都只需要关注自己要实现的业务逻辑,完全不用去关心其他人的工作进展,因为你的任务跟别人没有任何关系,你的任务可以单独测试,你的任务也不用依赖于别人的组件,再也不用扯不清责任了。所以,在一个大中型项目中,团队成员分工明确、责任明晰,很容易将一个大的任务划分为细小的任务,开发效率和产品质量必将得到大幅度的提高。

(3).可复用性好,我们可以把具有普遍性的常用组件独立出来,反复应用到项目中的其它部分,或者是其它项目,当然这也是面向对象的基本特征。显然,IoC更好地贯彻了这个原则,提高了模块的可复用性。符合接口标准的实现,都可以插接到支持此标准的模块中。

(4).IoC生成对象的方式转为外置方式,也就是把对象生成放在配置文件里进行定义,这样,当我们更换一个实现子类将会变得很简单,只要修改配置文件就可以了,完全具有热插拨的特性。

有时间可以理解一下底层的beanFactory的原理,也就彻底明白了spring的工作机制了,
参考:http://www.cnblogs.com/digdeep/p/4518571.html
本篇博客参考:http://www.cnblogs.com/gaopeng527/p/5246704.html

0 0
原创粉丝点击