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

Google Guice与PicoContainer进行依赖注入

严景焕
2023-03-14
问题内容

我的团队正在研究依赖项注入框架,并试图在使用Google-Guice和PicoContainer之间做出选择。

我们正在寻找框架中的几件事情:

  1. 较小的代码占用空间-我的意思是较小的代码占用空间是我们不想在我们的代码库中到处都有依赖项注入代码垃圾。如果我们需要在将来进行重构,我们希望它尽可能简单。
  2. 性能-创建和注入对象时,每个框架有多少开销?
  3. 易于使用-学习曲线是否很大?我们是否必须编写大量代码才能使一些简单的工作完成?我们希望配置尽可能少。
  4. 社区规模-较大的社区通常意味着将继续维护项目。我们不想使用框架,而不得不修复我们自己的错误;)此外,框架的开发人员/用户社区也可以(希望)回答我们所遇到的任何问题。

将两个框架与所列标准进行比较将不胜感激。任何有助于将两者进行比较的个人经验也将非常有帮助。

免责声明:我对依赖注入还相当陌生,因此如果我提出的问题与本次讨论无关,请原谅我。


问题答案:

您可能希望将Spring纳入您正在考虑的Dependency Injection框架列表中。以下是您问题的一些答案:

耦合到框架

Pico -Pico往往会阻止二传手的注入,但除此之外,您的课程无需了解Pico。只是需要知道的接线(对于所有DI框架都是正确的)。

Guice -Guice现在支持标准的JSR 330注释,因此您不再需要代码中特定于Guice的注释。Spring还支持这些标准注释。Guice伙计们使用的论据是,如果不运行Guice批注处理器,那么如果您决定使用其他框架,则这些不会产生影响。

Spring
-Spring的目的是让您避免在代码中提及Spring框架。因为他们确实有很多其他的帮助器/实用程序等,但是依赖于Spring代码的诱惑非常强烈。

性能

Pico- 我对Pico的速度特性不太熟悉

Guice -Guice设计得很快,参考文献中提到的比较有一些数字。当然,如果速度是主要考虑因素,则应考虑使用Guice或手工接线

春天 -春天会很慢。已经进行了一些工作来使其更快,并且使用JavaConfig库应该可以加快速度。

使用方便

Pico-易于 配置。Pico可以为您做出一些自动接线决定。尚不清楚它如何扩展到非常大的项目。

Guice-
配置简单,您只需添加批注并继承自AbstractModule即可将事物绑定在一起。由于将配置保持在最低水平,因此可以很好地适应大型项目。

Spring- 相对容易配置,但是大多数示例使用Spring XML作为配置方法。随着时间的推移,Spring
XML文件可能会变得非常庞大和复杂,并且需要花费一些时间来加载。考虑混合使用Spring和手动启动的依赖项注入来克服此问题。

社区规模

笔克 -小

Guice-

春天 -大

经验

Pico- 我在 Pico上 没有太多经验,但是它不是一个广泛使用的框架,因此将很难找到资源。

Guice
-Guice是一个流行的框架,当您有一个要重新开始大量开发的大型项目时,欢迎您关注速度。我担心配置的分布式性质,即不容易看到整个应用程序如何组合在一起。在这方面有点像AOP。

春季
-春季通常是我的默认选择。就是说,XML可能变得很繁琐,并且导致速度变慢。我经常最终将手工制作的依赖注入和Spring结合使用。当您实际上需要基于XML的配置时,Spring
XML相当不错。Spring还付出了很多努力来使其他框架更加依赖于依赖项注入,这很有用,因为这样做时它们经常使用最佳实践(JMS,ORM,OXM,MVC等)。

参考文献

  • 微微
  • 吉斯
  • 弹簧
  • 春季/ Guice / Pico比较
  • 另一个Spring / Guice性能比较


 类似资料:
  • 例如,Foos的资源可能如下所示: 对于酒吧:

  • 从零开始,没有任何以前的Jersey 1.x知识,我很难理解如何在我的Jersey 2.0项目中设置依赖注入。 我也知道HK2在Jersey 2.0中可用,但我似乎找不到有助于Jersey 2.0集成的文档。 我可以让容器启动并提供我的资源,但是当我将@inject添加到MyService时,框架就会抛出一个异常: 我的starter项目可在github:https://github.com/do

  • 我尝试在我的活动中注入修改,但我得到了空异常 这是AndroidApplication类

  • 我正在寻找一种优雅的方式,在标准spring服务中定义字段 如果没有龙目,我们的服务如下: 现在,我们的团队只想使用lombok构造函数(这样我们就可以轻松地添加其他服务)。上面的服务现在看起来是这样的: 如何解决这些问题(在源代码注释中提到)? 我在很多项目中都看到了这个“问题”。我上面提到的变体是我看到的唯一解决方案。当增加字段数量时,这两种解决方案都变得更加丑陋。

  • 问题在于Azure WebJobs SDK只支持公共静态方法作为作业入口点,这意味着无法实现构造函数/属性注入。 我在官方WebJobs SDK文档/资源中找不到有关此主题的任何内容。我遇到的唯一解决方案是基于本文描述的服务定位器(anti)模式。 对于基于Azure WebJobs SDK的项目,有没有一种好方法可以使用“适当的”依赖项注入?

  • 在React中,想做依赖注入(Dependency Injection)其实相当简单。请看下面这个例子: // Title.jsx export default function Title(props) { return <h1>{ props.title }</h1>; } // Header.jsx import Title from './Title.jsx'; export defa