Java设计原则的依赖倒置是什么

依赖倒置简介

我们经常在框架开发过程中听说依赖倒置、依赖反转、控制反转、依赖注入、ioc一些名词,我们常听的这些名词和开发设计原则中的依赖反转原则是有关系,我们来看看这几个名词:

控制反转(IOC),这个是Spring面试基本上都会问的一个问题,IOC全称Inversion of  Controller,IOC不一定是Spring的特性,Spring是用IOC的一个基础框架;简单理解就是之前通过简单的方法把业务代码冗余在一起,需要改的时候比较麻烦,权限完全由开发者控制,反正意思是通过一些设计模式让开发者不在关系基础开发,只要实现应该实现的功能,权限交由程序控制;

依赖注入(DI),全称为Dependency Injection,简单理解就是需要操作的对象通过构造方法、get/set、接口构造的对象,通过外部传入的对象注入新的对象,这个就是依赖注入,Spring就是运用比较好的一个框架;

依赖反转原则(DIP),全称为Dependency Inversion Principle,也可以叫依赖倒置原则,意思就是:高层模块(high-level modules)不要依赖低层模块(low-level)。高层模块和低层模块应该通过抽象(abstractions)来互相依赖。除此之外,抽象(abstractions)不要依赖具体实现细节(details),具体实现细节(details)依赖抽象(abstractions)

模块概念

Java设计原则的依赖倒置是什么

立即学习“Java免费学习笔记(深入)”;

我们经常所说的高模块和低模块是指什么?我们怎么区分,或者画图的时候标注关系;

简单来说就是,在调用链上,调用者属于高层,被调用者属于低层。为什么会用这样一个设计呢,追根溯本就是松耦合,不然高模块强绑定低模块,也不会因为底层模块的代码而影响高层模块;但是在实际场景中是否完全有必要遵守这一规则呢?我们来看一个常见的例子:

MVC架构:常用的使用方式Controller–>Service–>Dao,Controller对应Service来说就是高模块,Service对于Dao来说也是高模块,但是我们在实际业务场景中直接通过注入的形式开发,当然有的也可能不会直接注入,通过接口的形式获取对象,这样带来的工作成本就会增加。

那我们就会有一个疑问,使用这一原则会带来工作成本的增加吗?按照我的理解话模块也应该是需要划分一个粒度,也需要分为模块间关系、代码间关键、基础框架设计关系、业务代码关系,我们要去考虑扩展性,如果来说业务基本上不会怎么扩展,完全没有必要用到这一原则。

好莱坞原则

好莱坞原则简称Don‘t call us, we‘ll call you,科普下在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。这和我们的依赖倒置原则不谋而合,所有依赖倒置原则也就叫好莱坞原则。

好莱坞原则的具体体现是模板方法模式,所有的组件都是被动的,所有的组件初始化和调用都由容器负责。这也是一个基础框架应该考虑的点,主要有以下好处:

对基于接口编程的支持

减少单件和抽象工厂的依赖

降低业务和框架的耦合

业务组件可复用,可插拔

依赖框架之Spring

我们需要要理清一个概念IOC是Spring的一个特性,成就了Spring框架的特性,并不是Spring框架创造了IOC。

Spring的IOC有什么作用?所谓IOC,就是由Spring IOC 容器来负责对象的生命周期和对象之间的关系

Spring IOC被注入对象提供被依赖对象也有如下几种方式:构造方法注入、stter方法注入、接口注入。

构造器注入

构造器注入,顾名思义就是被注入的对象通过在其构造方法中声明依赖对象的参数列表,让外部知道它需要哪些依赖对象。构造器注入比较简单,通过构造方式构造完成之后就完全可以使用。

TestBean(Test test){
this.test = test;
}

登录后复制

setter 方法注入

对于 JavaBean 对象而言,我们一般都是通过 getter 和 setter 方法来访问和设置对象的属性。所以,当前对象只需要为其所依赖的对象提供相对应的 setter 方法,就可以通过该方法将相应的依赖对象设置到被注入对象中。相比于构造器注入,setter 方式注入会显得比较宽松灵活些,它可以在任何时候进行注入

public class TestBean {

private Test test;

public void setTestBean(Test test) {
this.test = test;
}
}

登录后复制

接口方式注入

接口方式注入显得比较霸道,因为它需要被依赖的对象实现不必要的接口,所以我们要合理去使用这种场景,一般在基础框架中很少存在,在业务领域就用的比较多了。

注解注入

现在Spring主流注入方式主要通过注解去做实现,都是基于元注解@Component去实现,也就与@Component产生很多派生注解。

@Autowrited
private TestBean testBean;

@Component
public TestBean(){

}

登录后复制

以上就是Java设计原则的依赖倒置是什么的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2626839.html

(0)
上一篇 2025年3月7日 00:58:13
下一篇 2025年3月7日 00:58:19

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • Java的SpringMVC拦截器怎么用

    拦截器(interceptor)的作用 spring mvc 的  拦截器  类似于 servlet 开发中的过滤器 filter,用于对处理器进行  预处理  和  后处理  。 将拦截器按一定的顺序联结成一条链,这条链称为  拦截器链(…

    2025年3月7日
    200
  • Java线程池的拒绝策略是什么

    池化设计思想 池话设计应该不是一个新名词。我们常见的如java线程池、jdbc连接池、redis连接池等就是这类设计的代表实现。 这种设计会初始预设资源,解决的问题就是抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等。就好比你…

    2025年3月7日
    200
  • java内存异常使用导致full gc频繁怎么解决

    问题系统 日常巡检发现,应用线上出现频繁full gc 现象 应用线上出现频繁full gc 排查过程 分析dump 拉dump文件:小插曲:dump时如果指定:live,则在dump前jvm会先进行一次full gc,并且gc log里会…

    2025年3月7日 编程技术
    200
  • Java Spring的两种事务是什么

    1. Spring中的事务控制方式 spring的事务控制可以分为编程式事务控制和声明式事务控制。 编程式 开发者直接把事务的代码和业务代码耦合到一起,在实际开发中不用。 声明式 开发者采用配置的方式来实现的事务控制,业务代码与事务代码实现…

    2025年3月7日 编程技术
    200
  • Java中的Javassist怎么使用

    开篇 说起 aop 小伙伴们肯定很熟悉,无论是 jdk 动态代理或者是 cglib 等,其底层都是通过操作 java 字节码来实现代理。asm、aspectj和javassist等是常用的操作字节码的技术。 ASM 其设计和实现是尽可能小而…

    2025年3月7日
    200
  • Java怎么在CompletableFuture中实现日志记录

    1.首先利用aop为所有请求入口添加requestid。 @Aspect@Componentpublic class LoggingAspect {    /**     * AOP注解的Controller类方法必须为 public 或 …

    编程技术 2025年3月7日
    200
  • Java如何实现优雅的参数校验

    一、引子 要对方法的参数进行校验,最简单暴力的写法是这个样子:     public static void utilA(String a,BigDecimal b){        if (StringUtils.isEmpty(a)){…

    2025年3月7日
    200
  • Java之SpringBoot怎么实现基本增删改查

    根据上图所示,idea中我们有7个比较重要的模块需要建立 (1)controller包:如果学习过或者对SpringMVC有所了解的小伙伴,肯定知道,controller是控制层,相当于我们的接收浏览器信息并响应发送相关信息的地方,具体的还…

    2025年3月7日 编程技术
    200
  • Java SpringMVC数据响应实例分析

    1)页面跳转   直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。  返回带有前缀的字符串: 转发:   forward:/WEB-INF/views/index.jsp 重定向:   redirect:/index…

    2025年3月7日
    200
  • Java反射怎么定义和使用

    定义 在java程序运行期间动态获取和操作类、方法、属性等元素的能力被称为java反射。它使得我们可以在程序运行时获取一个类的信息,并对其进行操作,这极大地扩展了java语言的灵活性和可扩展性。 在Java中,每个类都有一个对应的Class…

    编程技术 2025年3月7日
    200

发表回复

登录后才能评论