java 字段构造函数_依赖注入–字段vs构造函数vs方法

java 字段构造函数

嗨,今天,我想简短地讨论将依赖项注入您的类的不同方式。

通常,您有以下三种注射方法

  • 直接进入字段/属性
  • 通过显式的setter方法
  • 通过显式的构造函数参数


现场注入

这种类型的注入为将所需的依赖项注入到类中提供了某种反射机制。

尽管这种注入类型的好处是,它消除了诸如setter方法或构造函数参数之类的混乱代码,但其缺点是这些依赖项是不可见的。 如果从外部查看类,则只会看到公共方法,并且可能是构造函数。

即使这使您非常清楚地了解了类提供的服务,但在我看来,它仍然具有以下主要缺点:

在为此特定类编写测试时,您必须检查该类以查看所需的依赖项,并且必须使用DI框架(即使是简单的测试),也必须使用一种反射机制来注入依赖项(模拟/存根/真实)。

更糟糕的是,传入依赖项的数量隐藏在该类中。 当然,您可以使用工具(JDepend等,pp。)告诉您依赖性的数量和方向,或者使用一个文件来指定注入,但是您必须依靠这种工具或检查类。

我观察到的另一个缺点是,与使用Setter或Constructor Injection的情况相比,创建具有多个职责的类的机会更高。
就像是:

哦,让我们使用这个精美的注解在这里注入我们需要的服务...几天/几小时后:测试这个野兽是如此的困难

二传手注射

Setter注入工具setter方法,每个依赖项一个,DI框架使用该方法来注入依赖项。

它是一个变体,它使依赖项显式显示,并为您清楚地了解特定类的依赖项。

在测试期间,它的好处是您不必使用DI框架或反射机制,而可以直接设置依赖项。

这种方法的缺点是:您可以构造处于无法使用状态的类。 这是因为如果需要依赖项或可选依赖项,则无法与外部区分开。

构造函数注入

构造函数注入对类的构造函数进行检测,DI框架使用该类来注入依赖项。 这是使依赖关系明确的另一个变体。

与Setter注入相反,它可以防止您在不规则状态下创建类。 (当然,您可以传递null,但这不只是一种作弊,对吗?)所以我要说,这是最严格的变体:

每个依赖项都是强制性的

这种注射类型的好处是

  1. 您必须只阅读一种方法,即构造函数,才能弄清楚此类的依赖关系。
  2. 您创建了一个不可变的类,它使缓存变得如此简单

同样,这里的缺点是您无法区分可选依赖项和必需依赖项。 构造函数强制设置所有字段。

我要讨论的最后一个变体是:

混合二传手和构造剂注射

我个人更喜欢此变体,混合了Setter和Constructor注入。

这给您:

  • 在合同级别上区分强制性依赖项和可选性的能力
  • 清楚说明特定类的依赖项是什么
  • 使您可以轻松地检查班级是否负有重大责任
  • 构建后正确配置的类

与纯方法类似,使用这种注入进行测试相当简单。 您不需要DI框架,并且可以轻松地将模拟的/存根的/真实的实现传递到要测试的类中。

使用/喜欢什么?

这个答案在很大程度上取决于您的框架/团队规则/语言。

但是我强烈建议您使用显式注入变量之一,因为它们使您无需使用依赖注入框架即可编写纯单元测试。

翻译自: https://www.javacodegeeks.com/2015/01/dependency-injection-field-vs-constructor-vs-method.html

java 字段构造函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338693.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言中return、break用法和区别

1returnreturn:跳出当前正在执行函数。使用方法:return (表达式);其中,(表达式)是可以省略的。 1.有返回类型return通常都是带有返回类型的,比如返回int型变量:int Fun(v…

兴趣点推荐代码_如何解读霍兰德职业兴趣测评结果?

霍兰德职业兴趣测评不难,难的是如何解读测评结果,这才是生涯规划测评中最重要的部分。今天我们就来说说霍兰德职业兴趣测评的结果应该如何解读。兴趣测评的结果是六种类型得分最高的三个代码依次排列组合而成,所以基本上就是R-实用型、I-研究…

linux mint 18支持安卓编译,Linux mint 18版本开启SSH服务

linux mint 18版本默认是没有安装ssh server的需要手动安装安装ssh server:此命令需要联网,会自动下载安装安装之后看是否开始了ssh,看到ssh-agent 和sshd 说明ssh server 已经启动了如果没看到ssh server 需要手动启动需要/etc/init.d/ssh s…

jcg q8 固件_JCG学院开设了Java设计模式课程!

jcg q8 固件自从我们推出JCG学院以来,已经有一段时间了。JCG学院是一个基于付费内容的高级订阅网站,提供有关最新,最先进技术的一系列课程,从RedSQL数据库(如Redis和CouchDB)到Android移动开发。 当然&…

C语言520心形表白,初学者福利!!

C语言实现打印出心形,初学者的表白神器。解题思路:这道例题我分了4部分,前3行一部分,4-6行一部分,7-13行一部分,最后一行一部分,读者请仔细阅读注释,小林写的很详细了。前三行输出&a…

python转型工资_【一点资讯】一个月完成转型!学会风变python到底有多值钱? www.yidianzixun.com...

入职新公司已经有半个月的时间了,现在想起来就在不久前还因为进退两难的工作、不喜欢的人际氛围和薪水少得可怜的工作发愁,就觉得和做了个梦一样神奇。一切的改变都因为学习风变python,一个月成功转型跳槽,并且还实现了薪资翻倍&a…

kali linux 2019教程,[教程]KALI LINUX 2.0 2019 更新国内源

2019年最新版本KALI 为 KALI 2019.1 下载地址:https://www.kali.org/downloads/有的新入门的朋友可能会问,为什么每次都无法手动更新 例如:Update命令的执行失败?其实系统是没有问题的,因为KALI自带的更新源是国外的。因国内延迟高&#xff0…

C | 构成和编码规范

C 的构成1.一个C 程序可以由一个程序单位或多个程序单位构成,每个程序单位为一个文件,编译过程中会对每个文件进行编译。2.每个程序文件包括:预处理命令、全局声明、函数,其中预处理命令就是程序开头的那行;全局声明则是在函数外进行的声明&a…

jersey mvc_如何将Jersey集成到Spring MVC应用程序中

jersey mvc我最近开始使用Java为Podcastpedia.org和JAX-RS实现构建公共的REST API,我选择了Jersey ,因为我发现它“自然”且功能强大-您可以通过遵循教程了解更多信息-带有Jersey和Spring的Java中的REST API设计和实现。 由于Podcastpedia.org是由Spring…

涡轮流量计说明书_实际应用中超声波流量计与电磁流量计哪个更好用

流量仪表是水务、石化等行业的重要仪器之一,可以用计量的眼睛来比喻。对于水务水利行业,更是具有特殊的意义。比如供水行业中的药剂的添加,如果相关的计量仪表精度不高,将直接影响到水质的优差,甚至会影响到用户人群的…

C语言数据类型转换(自动类型转换 强制类型转换)

数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。自动类型转换自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。1) 将一种类型的数据赋值…

observable_在Completablefuture和Observable之间转换

observableJava 8中的CompletableFuture<T>是对T类型的值将来将可用的承诺的高级抽象。 Observable<T>非常相似&#xff0c;但是它承诺将来会出现任意数量的项&#xff0c;从0到无穷大。 异步结果的这两种表示形式与仅使用一项即可使用Observable而不是Completable…

python idle使用anaconda中库怎么用_如何使用Anaconda学习Python

要学习Python进行数据分析&#xff0c;需要先安装Anaconda和Jupyter Notebook关于Anaconda1、为什么要用Anaconda&#xff1f;1)Anaconda自带常用数据科学包&#xff0c;你可以立即开始处理数据2)conda可帮助更好的安装和整理第三方包3)Conda可帮助你为不同的项目建立不同的运行…

C 为什么非要引入那几种类型转换?

为什么要引入这几种类型转换&#xff0c;它与C语言中的强制类型转换有什么区别&#xff1f;这四种类型转换分别应用在什么场景&#xff1f;C 为什么要引入这几种强制类型转换&#xff1f;我们都知道C 完全兼容C语言&#xff0c;C语言的转换方式很简单&#xff0c;可以在任意类型…

删除一个程序Linux,一天一个Linux基础命令删除文件或目录命令rm

rm删除文件命令1、命令格式rm [options] file...2、命令功能rm命令&#xff0c;删除文件命令&#xff0c;是Linux系统下常用命令&#xff0c;该命令的功能为删除一个文件或者整个目录或者目录中的部分文件&#xff0c;它也可以将某个目录及其下的所有文件及子目录均删除。对于…

C语言笔试两题,有坑

题目一最近遇到的一个华为笔试题题目&#xff1a;对字符串中的所有单词进行倒排。说明&#xff1a;1、构成单词的字符只有26个大写或小写英文字母&#xff1b;2、非构成单词的字符均视为单词间隔符&#xff1b;3、要求倒排后的单词间隔符以一个空格表示&#xff1b;如果原字符串…

python apply_async函数_进程池未执行apply_async中添加的函数就直接结束了

代码没有执行apply_async中添加的函数就直接结束了from bs4 import BeautifulSoupimport randomimport requestsimport pymongoimport datetimeimport randomimport timefrom multiprocessing import Pooluser_agents [Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X)…

java8 streams_Java 8 Streams API作为友好的ForkJoinPool外观

java8 streams我最喜欢Java 8的功能之一是流API。 最终&#xff0c;它消除了代码中的几乎所有循环&#xff0c;并使您可以编写更具表现力和重点的代码。 今天&#xff0c;我意识到它可以用于其他用途&#xff1a;作为ForkJoinPool一个不错的前端。 问题&#xff1a;执行器样板…

嵌入式linux文件系统启动,嵌入式Linux之文件系统启动分析【原创】

this.p{ m:2,b:2,loftPermalink:,id:fks_094068082086089066084084095095080087080066082082083075,blogTitle:嵌入式Linux之文件系统启动分析【原创】,blogAbstract:author&#xff1a;张继飞写在前面&#xff0c;这一切必须是在Linux内核挂载文件系统后。在Linux内核中找到/i…

C语言:如何定义一个和库函数名一样的函数,并在函数中调用该库函数

某个函数fun_1()是在lib内&#xff0c;没法修改的&#xff0c;在程序中大量的使用了该函数&#xff0c;现在想把原本fun_1失效&#xff08;现在失效的方法是#define fun_1(..)),用另外一个函数fun_2(),可是fun_2最后也需要调用fun_1,上面的失效方法感觉就不行了&#xff0c;请问…