当前位置: 首页 > 面试题库 >

使用applicationcontext.getbean与@configurable相比的优势

贲言
2023-03-14
问题内容

不是由bean* 通过 applicationcontext.getbean 进行管理的bean 相比,使用
@configurable有 什么优势?任何人列出的利弊?
***


问题答案:

我要为此得到 -20 。即使是臭名昭著的马丁·福勒(Martin Fowler)发明了这个可怕的“依赖注入”名称,也认为它不适合测试:

http://martinfowler.com/articles/injection.html

人们偏爱依赖注入的一个普遍原因是它使测试更加容易。这里的重点是进行测试,您需要轻松地用存根或模拟替换真实的服务实现。但是,依赖注入和服务定位器之间实际上并没有什么区别:两者都非常适合存根。我怀疑这种观察来自于人们没有努力确保可以轻松替换其服务定位器的项目。这是持续测试的地方,如果您不能轻易地对服务进行存根测试,那么这意味着您的设计存在严重问题。

这是我的反对意见:

  1. DI将实现依赖关系转换为接口依赖关系。您的班级受到二传手的污染,否则他们不应该去那里。是的,真正的结帐流程取决于信用卡服务,邮件服务,数据库服务以及谁知道什么明天,但我们不应该宣传这些依赖项。它们是临时的,按需的,而不是界面友好的。也许下个月,整个结帐过程将简化为REST调用

  2. 性能。一种方法通常不需要服务。DI对于每个服务至少需要一个字段变量,并且只要宿主对象是活动的,就必须对其进行引用。如果服务具有每个客户端状态,这是非常糟糕的。我不是一个对性能敏感的人,但这感觉是错误的。

  3. 生产环境的编码变得更加困难。想想一下,每次需要服务时,添加了多少样板代码以使用DI。一切都是为了简化测试。首先-什么?生产是第一要务;测试应该适用于它,并且与此相反,而不是相反。 测试不是一种宗教,人们! 专注于生产环境,以后再担心测试。第二-现在测试真的容易吗?

  4. 在测试中,您只需要模拟一些繁重且涉及VM外活动的服务。使用服务定位器,您将获得一个包含这些模拟服务的测试配置,然后就可以完成。您的结帐流程以及依赖于这些服务的所有类都可以轻松进行测试。在DI中,您必须在 每个 单元测试中手动管理那些依赖项。-但!但是,有了DI,您现在就可以灵活地为不同的测试单元提供不同的模拟邮件服务!哦,对你有好处!

  5. “ DI鼓励采用统一的服务配置方式”- 仅当 您使用相同的框架时。实际上,它与DI无关;框架强制执行一种配置方式,您也可以说Spring鼓励采用统一的服务定位方式。当一个框架被广泛使用时,它可以成为事实上的标准,因此使不同的开发人员之间的交流变得更加容易-仅仅是因为网络的影响,而不是因为其设计选择固有的优势。

总之,这不利于设计,不利于性能,不利于生产,不利于测试并且与设置标准无关。到底有什么好处呢?就像很早以前就建立了许多可疑起源的愚蠢规则和惯例一样,但我们仍然每天都盲目地遵循它们。这就是使社会运转的原因。



 类似资料:
  • 问题内容: 用…实现事情 似乎 已经 很简单 了… 与 ngResource相比 ,使用Restangular 有哪些优点/缺点? 1.1.3 将返回承诺,并且可以使用[最新的PRcommit来实现。将来会提供支持来支持Restangular所做的其他动词吗?如果发生这种情况,Restangular似乎将消失并变得不耐烦。 问题答案: 我是Restangular的创建者。 我已经在自述文件中创建了

  • 问题内容: 过去,我的几个Ajax应用程序都使用GET请求,但是现在我开始使用POST请求。POST请求似乎更安全,并且绝对更友好/漂亮。因此,我想知道是否有任何原因使我应该使用GET请求。 问题答案: 我通常这样设置问题: 请求后有什么重要的变化吗? (尽管有日志记录等)。如果是,则应该是POST请求,如果不是,则应该是GET请求。 我很高兴您将POST请求称为“稍微”更安全,因为这几乎就是它们

  • IOLoop 是 tornado 的核心。程序中主函数通常调用 tornado.ioloop.IOLoop.instance().start() 来启动IOLoop,但是看了一下 IOLoop 的实现,start 方法是这样的: def start(self): """Starts the I/O loop. The loop will run until one of the callb

  • 问题内容: 有人可以告诉我为什么对node.js如此大惊小怪吗?与用php框架编写的常规网站相比,用node.js编写的常规网站(比如博客)是否更快?我知道用node.js编写的Web服务器将比apache快,但是不创建线程或类似对象的真实Web应用程序呢? 问题答案: 编辑: 有两个主要优点: 速度!(性能) Node.js是事件驱动和非阻塞的,并且非常擅长处理并发请求。 这是指向 Apache

  • TLDR: 一个简单的(单隐藏层)前馈Pytorch模型被训练来预测函数的性能大大低于使用Keras构建/训练的相同模型。为什么会这样,可以做些什么来减轻性能差异? 在训练回归模型时,我注意到PyTorch的性能大大低于使用Keras构建的相同模型。 这种现象以前已经被观察和报道过: > 相同的模型在pytorch上产生的结果比在张量流上更差 pytorch中的CNN模型比Tensoflowflo

  • 我已经为自己构建了一个简单的博客Django应用程序,并希望使用AWS部署它。经过一些研究,看起来我的部署选项是和。 与EC2相比,使用