了解Spring的核心依赖注入和控制反转IOC之前需要先了解一下,之前客户端是如何处理这件事情的。
客户案例--创造一台汽车
/传统方式处理/
首先我们知道客户端创建一个对象,比如一台汽车,需要new car 。这个时候我们知道car还需要引擎engine。 所以我们又需要new 一个engine。 并让engine注入到car中. 那么一台汽车就好了。 这个时候就有一个问题,就是汽车需要量产,我们需要1000台汽车cars. 如果按照传统的做法就是我们需要new 1000car ,同时还要new 1000个engine。 这样非常复杂,同时占用了相当大的内存。这个就是传统的正转。
/Spring控制反转和依赖注入处理方式/
Spring控制反转IOC的意思就是你不用显示的在一个类里用new关键字来生成你想要的对象而只需在xml配置文件里添加相应节点即可,这样就让你整个程序的组成变得灵活多样。 之前的方式是由客户端主动的去new cars和engine这些东西。现在的方式是Spring提供IOC也就是控制反转的一个思想。 所有的创建类都由IOC容器创建好。比如客户端需要一辆car,以及engine。那么在客户端需要之前,IOC容器就已经new了一个car,和engine. 并且将engine已经注入到car里面去了。 也就是客户端需要car,IOC就主动将装配完毕的car给客户端了。也就是说控制反转就是之前由客户端程序控制创建的机制,变为IOC容器来控制创建的反转。 依赖注入就是客户端程序依赖于IOC容器去注入程序所需要的类也就是外部资源。
/那么还有一个问题,当客户端服务器需要1000个car的时候,IOC容器是如何体现控制反转和依赖注入的好处的呢?/ 我们知道传统的方式是客户端程序需要new 1000个car 以及1000个engine。造成了资源的浪费。 由于控制反转这里IOC容器是在客户端程序需要car之前就已经将car创建完毕,所以1000 car在每次创建的时候只开辟一个内存空间给car,和另一个内存空间给engine。然后将car依赖engine得到最终的car。 然后重复1000次就完成了创建。这样就有效的节约了内存资源。 创建car,依赖于engine的例子类似于公司员工需要使用打印机的案例。10个员工需要打印机,公司不可能就买10个打印机。而是只买一个,然后先后打印的方式完成。
代码示例
/***一个人是中国人的时候说:你好,中国。是外国人的时候说:HelloWorld ***/
1.所需要的类
这里我们需要HelloChina的类来说中文,以及另一个HelloWorld的类来说英语。同时我们定义了一个接口IHellloWorld接口类。还有我们需要一个人来说,所以我们定义了Person类,并拥有IHelloMessage属性,以及say方法。代码如下:
2.主方法
在主Main方法中读取Spring配置文件helloMessage来获取程序所需要的外部资源Person.而不再是通过new来创建。代码如下
3.Spring配置文件helloMessage.xml的配置
Spring的依赖注入和控制反转都是通过配置文件进行实现的。每一个Bean都对应相应的一个类。本例中Bean了HelloWorld,HelloChina,Person三个类。同时前面两个又是通过依赖的方式给到Person中。此处我们依赖的是HelloWorld这个类。 具体代码如下:
4.输出结果
根据配置文件中,Person属性helloMessage依赖的不同实现类,打印的结果也会不同。