对依赖倒置原则的理解

框架在架构设计上遵循一个重要的设计原则叫“依赖倒转原则”,依赖倒转原则是高层模块不能依赖低层模块,它们应该共同依赖一个抽象,这个抽象由高层模块定义,由低层模块实现。所谓高层模块和低层模块的划分,简单说来就是在调用链上,处于前面的是高层,后面的是低层。

  我们以典型的 Java Web 应用举例,用户请求在到达服务器以后,最先处理用户请求的是 Java Web 容器,比如 Tomcat、Jetty 这些,通过监听 80 端口,把 HTTP 二进制流封装成 Request 对象;(见手写Web Server)

然后是 Spring MVC 框架,把 Request 对象里的用户参数提取出来,根据请求的 URL 分发给相应的 Model 对象处理;

再然后就是我们的应用程序,负责处理用户请求,具体来看,还会分成服务层、数据持久层等。

  在这个例子中,Tomcat 相对于 Spring MVC 就是高层模块,Spring MVC 相对于我们的应用程序也算是高层模块。我们看到虽然 Tomcat 会调用 Spring MVC,因为 Tomcat 要把 Request 交给 Spring MVC 处理,但是 Tomcat 并没有依赖 Spring MVC,Tomcat 的代码里不可能有任何一行关于 Spring MVC 的代码。那么,Tomcat 如何做到不依赖 Spring MVC,却可以调用 Spring MVC?如果你不了解框架的一般设计方法,这里还是会感到有点小小的神奇是不是?秘诀就是 Tomcat 和 Spring MVC 都依赖 J2EE 规范,Spring MVC 实现了 J2EE 规范的 HttpServlet 抽象类,即 DispatcherServlet,并配置在 web.xml 中。这样,Tomcat 就可以调用 DispatcherServlet 处理用户发来的请求。(类比https://www.cnblogs.com/lxyit/p/9672097.html

  同样 Spring MVC 也不需要依赖我们写的 Java 代码,而是通过依赖 Spring MVC 的配置文件或者 Annotation 这样的抽象,来调用我们的 Java 代码。所以,Tomcat 或者 Spring MVC 都可以称作是框架,它们都遵循依赖倒转原则。

思考:Web 应用程序的服务层 Service 和数据持久层 DAO 也是上下层模块关系,你设计的 Service 层是否按照框架的一般架构方法,遵循依赖倒转原则?

答:一般就是抽象出相应的接口的方法,不依赖具体。面向接口编程。但重要的是接口是高层需求的抽象,还是底层实现的抽象。这是依赖倒置的关键,面向接口本身并不能保证依赖倒置原则,否则和接口隔离原则没有区别。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值