刚才写完了随笔,要保存的时候突然就没了...只好再做一次笔记,算是加深印象吧...
开始学习Spring框架,以前虽然也在视频上接触过一点Spring的内容,但是学得都是老师直接告诉我们该怎么怎么配置,这个bean有什么用之类的。现在想自己看看书,从头理解这个框架的用法,还有概念。
之前一直不理解IoC(控制反转)和DI(依赖注入)的含义。原来IoC是一个通用的设计原则,用于解耦组件之间的依赖关系。而DI则是具体的设计模式,是IoC的一个典型实现,怪不得之前看的资料上说IoC和DI可以理解为同一个东西...虽然这个说法不太对,但是还是能给人加深一些记忆的。
理解IoC概念的同时,就得看看Spring框架的IoC容器,了解它是怎么实现对组件的解耦的,了解它是如何“依赖注入“的。为了引出的容器的概念,可以看一个很简单例子:两个类(Apple类和Pear类)实现了同一个接口(Fruit接口),它们中都只有一个toTranslate方法(分别输出”我是苹果“和”我是梨子“),现在写一个FruitService类,代码如下:
public class FruitService { private Fruit fruit; public void setFruit(Fruit fruit) { this.fruit = fruit; } public void mySaid(){ System.out.println(fruit.toTranslate()+",我很好吃”); } }
于是,在测试类(即Main)里,我需要实例化FruitService,Apple,Pear三个类,并把Apple或Pear setter进FruitService里,最后调用方法才能获得想要的内容(“我是苹果,我很好吃”或者“我是梨子,我很好吃”),代码如下:
public class Test { public static void main(String[] args) { Apple apple=new Apple(); Pear pear=new Pear(); FruitService service=new FruitService(); service.setFruit(apple); service.mySaid(); } }
很明显,这样需要我们亲自实例化Apple,Pear等方法,还要亲自将Apple类的实例注入到FruitService中。并且这样的代码耦合度高,从依赖性的角度就可以发现,Apple和Pear依赖Fruit接口,FruitService类依赖Apple,Pear和Fruit。这样不利于代码的维护。
所以可以想象为什么需要一个Ioc容器。因为容器可以管理组件,这意味着实例化类和注入可以由容器完成,而我们只需要把相应的组件放在容器里就可以了。可以写一个简单的与springIoC容器概念相似的Container类。(因为是简单的实现,所以用Map来存放组件,假装像在配置文件里配置的效果)代码如下:
public class Container { private Map<String,Object> components;//用于存放组件 public Container(){ Apple apple=new Apple(); components.put("apple",apple); FruitService service=new FruitService(); service.setFruit(apple); components.put("service",service); } public Object getComponents(String id){ return components.get(id);//用于获取组件 } }
接下来再看看测试类:
public class Test { public static void main(String[] args) { Container container=new Container(); FruitService service=container.getComponents("apple"); service.mySaid(); } }
这时候就会输出”我是苹果,我很好吃”了。由上面测试类也可以看出,为什么使用Spring IoC容器时都要先实例化该容器,道理也是一样的。依赖注入则是和上面例子中容器类的setter概念相似,即容器帮你把需要的对象进行了setter。形象化的说法就是,你不必自己去找食物,已经有人把食物塞到你手里了,这个人就是IoC容器。
理解Spring框架的控制反转笔记结束。
理解Spring框架的控制反转——学习笔记,布布扣,bubuko.com
原文:http://www.cnblogs.com/czhfuture/p/3572334.html