Spring IoC(Inversion of control)控制反转

Spring IoC(Inversion of control)控制反转

spring的两大特性切面编程AOP( Aspect Oriented Programming)和控制反转IOC(Inversion of Control),我们今天来说说控制反转。


Inversion Of Control

控制反转。怎么控制?如何反转?
首先,我们来看看最基本的java调用:

    //对象Socket1
    Socket1 socket1 = new Socket1();
    user.setSocket(socket1);
    user.userSocket();

现在假设对象换成了Scoket2,那么应该是:

    //对象Socket2
    Socket2 socket2 = new Socket2();
    user.setSocket(socket2);
    user.userSocket();

我们的代码,被编入到工程中,打成jar包。也就是一种压缩包。如果需要修改代码,那么就要重新打包。如果一个工程非常大,这样的修改是非常耗时的。
如何解决这个问题呢?
先看看原来的模式,思考一下。实例化user对象(代码中没写),实例化Socket1或者2对象,用set方式将Socket注入到user中,user使用socket。ok,这是原来的样子。
现在我们看看spring的模式,

    <bean id="socket" class="socket1"/>
    <bean id="user" class="user">
        <property name="socket" ref="socket"/>
    </bean>

这是xml,首先描述一下xml:
可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言.
可以理解为一种标记描述语言。计算机通过阅读他,能获取结构信息,然后知道去干什么。
spring通过阅读这一段xml格式的描述信息,知道了需要通过他们类所在的路径(class)去创建这两个名为socket和user的bean,并且知道了这两个bean之间的关系(把名为socket的bean放到user的名为socket的属性中)。
spring实例化id为socket的socket1对象,实例化id为user的user对象,并将socket1对象注入到user对象中(id是对对象的命名)。这是spring的工作模式
现在,你只需要修改xml中的class中的socket1位置为socket2,就能达到上述修改代码所达到的效果。
创建bean的事情,被spring托管了 ,而不需要代码进行直接的创建。以前是你用代码来创建想要的user对象,现在是spring通过xml描述信息创建你想要的对象,相当如代码创建你想要的对象!
什么叫做控制反转你用代码创建对象变成了代码为你创建对象!,
使用对象
spring模式中,通过xml的描述信息,spring将这些操作完成了,user对象被注入了socket对象。
思考一下,原来的情况是主动new对象socket通过set方法注入到user中,一条线跑下去,现在通过描述信息,spring直接生成一个注入了socket的user对象。反过来,spring直接给了一个你想要的user!
反转控制
你不需要去寻找资源,只需要告诉springIoC,springIoC就会直接帮你找到想要的资源,这就是IOC。
对应到我们上述的例子,资源就是指的Socket。

把所需要注入的对象,抽象为需要的资源。资源的获取不再以直接的new对象形式获取,而是通过通过描述信息,由spring直接提供。

相对的来说,以前是通过代码获取资源对象,现在是通过阐述xml描述信息,由代码(spring也是代码)直接提供

IoC的作用

这里必须要说到另外一个概念:耦合,百度百科的工业解释:
耦合是指两个或两个以上的电路元件或电网络等的输入与输出之间存在紧密配合与相互影响,并通过相互作用从一侧向另一侧传输能量的现象。
在软件行业,耦合也就是两个类、对象之间的联系。
我进一步抽象,耦合就是两个元素的之间的联系和影响。
另一个概念,解耦,也就让两个元素之间的联系和影响降低或者消除。
如何解耦?在我看来就是关系转移。如果有两个元素相互影响,相互需要,也就是有耦合关系:
A和B
进行解耦就是依赖联系转移(转移关系是一种手段,为了达到解耦的效果):
ABC
如果没有了C呢?
AB
这样一看,A和B的确没有联系了,那么也就是A和B解耦了。
聪明的你自然会有新的问题。这样的话,的确简化了元素之间的联系。现在所有的元素关系都成了元素和spring的关系,元素和元素之间没有了之间的联系,但是这样,元素不又和spring耦合在一起了么?要进行配置解耦,我们需要了解JAVA的另一个概念:
java反射

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
通过反射机制,进一步的解除了元素和spring框架之间的耦合。反射是框架的灵魂!

猜你喜欢

转载自blog.csdn.net/xl_1851252/article/details/81391930