之前只是知道Spring的精髓是依赖注入,控制反转,也只是知道这些名词而已,没有理解到精髓,今天看了知乎的一篇文章茅塞顿开,建议跟我一样迷茫的都看下:
这篇是读后感,对自己的理解再做个总结吧
正依赖
依赖反转,从字面理解就是把依赖倒过来了呗,那原来依赖正着的时候是啥样的呢?
正着的时候是上层建筑依赖下层建筑,依赖方式是在自己构造的时候把下层先构造好,比如Bird
和Wing
:
public class Bird {
Wing wing;
public Bird() {
wing = new Wing();
}
}
class Wing {
}
Main方法:Bird bird = new Bird();
这就是典型的上层依赖下层(为了更方便理解,可以直接把依赖理解为依赖构造函数),这样的坏处是如果下层的构造函数改了,增减了参数,那上层的构造函数也得加上类似的参数,那如果上层还有上层呢?就要一层一层加上去(如果这里不理解的话建议戳上面的链接看知乎原文,答主说的肥肠清晰)。唯一的好处是Main方法倒是很简洁。
依赖反转
这里按照上面的理解(为了更方便理解,可以直接把依赖理解为依赖构造函数)
叫做取消依赖更合适一些,就是上层不再依赖于下层的构造函数,怎么做到的?下层直接构造好,把整个下层当做参数传进来:
public class Bird {
Wing wing;
public Bird(Wing w) {
wing = w;
}
}
class Wing {
}
Main方法:Wing wing = new Wing(); Bird bird = new Bird(wing);
这样做,如果Wing类构造函数加个参数,只需要改Main方法就行了,坏处是如果建筑层数很多的话,需要从低到高一个一个new,如果用到的地方很多,每次创建一个顶层对象都要这样那真的很麻烦
怎么简化构造代码?
就是把构造的代码封装起来呗,所有地方都调用封装好的方法创建顶层对象
Spring更高级一些,通过注解或配置文件的方式,你连一次都不用自己写,不用知道这个从底层要高层的链路,只需要通过注解或者xml告诉Spring这个类依赖的下层类是什么,下层类自然也有自己的依赖,Spring会自己一层一层地往下找,然后从最底层开始new,直到返回顶层建筑对象