第二周课程作业
请描述什么是依赖倒置原则,为什么有时候依赖倒置原则又被称为好莱坞原则?
依赖倒置原则是指高层模块不应该去依赖低层模块,它们应依赖共同一个高层抽象。
也就是说,接口被高层模块定义,高层模块拥有接口,低层模块实现高层接口。
不是高层模块依赖低层的接口,而是低层模块依赖高层接口,从而实现依赖关系的倒置。
对于Service和DAO这个例子来说,就是Service定义接口,DAO实现接口,这样才符合依赖倒置原则。
所以依赖倒置也被称为好莱坞原则,即 你不要调用我,我会去调用你。
高层模块&低层模块:
例如 我们日常使用MVC三层架构中的Controller与Service,Controller就是高层模块,而Service就是低层模块,因为Controller会去调用Service。
例如 我们日常开发中,前端开发人员与后端开发人员,前端开发人员接到需求后,在做页面的同时,他们知道自己需要什么样的接口,接口需要后端人员开发。所以前端人员属于高层模块,后端开发人员属于低层模块。然而我们日常开发都是由后端开发人员撰写接口文档交给前端开发人员,实际上这并不符合依赖倒置原则。根据依赖倒置原则,前端开发人员(高层模块)应该定义接口(高层抽象),前端开发人员(高层模块)与后端开发人员(低层模块)共同依赖这个接口文档进行工作(高层抽象),后端开发人员实现这个高层抽象,前端开发人员调用高层抽象的实现。
请描述一个你熟悉的框架,是如何实现依赖倒置原则的?
我们在写Web应用时,肯定会引用Servlet容器,只要我们实现了Servlet接口,并且将Servlet配置好,访问Tomcat、Jetty、Undertow等Servlet容器即可访问到我们的Servlet。即Servlet容器是高层模块,Servlet、Filter是高层模块的抽象接口,开发者是低层模块依赖高层抽象接口(Servlet、Filter)自定义对应的Servlet、Filter。
Spring Framework中所提供的自动装配功能,Spring Framework定义了一些SPI,通过SpringFactoriesLoader读取用户实现SPI接口的类进行调用。
例如
自定义类的自动装配时,需要在META-INF/spring.factories配置文件中配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=配置自动装配的类(此处类并 没有实现SPI接口,但是需要Spring Framework提供的注解)。
Spring boot提供的事件SPI,SpringApplicationRunListener、ApplicationContextInitializer等等(也需要在META-INFO/spring.factories中配置)
高层模块定义SPI,低层模块实现SPI,高层模块会调用所有实现了SPI的类。诸如此类,很多框架中都会提供SPI,例如Tomcat,Dubbo,Spring Framework等等。
Cache类图
DefaultCache实现了Cache、ReBuildable接口。
评论