guice - Google guice 惰性绑定
问题描述
我们被要求探索 guice 作为一个依赖注入框架,因为它是轻量级的。我正在学习/体验 guice 并且有一些我无法理解的问题,所以我想问一下。
1) guice 何时使依赖项可用?在 Guice.createInjector ajf 行执行期间,然后读取模块并构造整个对象图?还是在第一次构造对象或调用方法时注入?
2) Providers 是在 guice 中延迟实例化类的唯一方法吗?
3)最后,假设我有一个模块A
和模块B
组装在一起来创建一个战争。A 的 guice 依赖项在它自己的 guice 模块中,B 也是如此。对几个类A
有 maven 依赖。B
我知道一个特定的类B
永远不需要被 guice 注入,因为它根本不会被调用A
并且我不给它一个绑定。但是 guice 告诉我我没有类的绑定B
并抛出 ProvisionException。当我知道我正在运行应用程序的功能不需要注入类时,我如何告诉 guice 忽略它们或在需要之前不关心它们?
解决方案
为了:
guice 何时使依赖项可用?
一般来说,构造是惰性的(对于非单例类,这是直观的——除非有人告诉你在某处注入一个实例,否则你不知道你需要一个新实例)。一个例外是急切地构造(等待它)的急切单例。Scopes 上的文档有更多关于让你的 Singletons 渴望与否的信息。
提供者是在 guice 中延迟实例化类的唯一方法吗?
不,@Inject
注释或手动调用Injector
实例也是惰性的。单例提供者是获得急切实例化的唯一方法。
当我知道我正在运行应用程序的功能不需要注入类时,我如何告诉 guice 忽略它们或在需要之前不关心它们?
我环顾四周,但找不到答案,除了我最初想到的简单问题:存根一个无用的提供者。它不干净,但是如果您无法更改,我看不到解决此问题的干净方法B
。
更广泛地说,我很好奇所有者B
做了什么导致这个错误,以及它是否“值得”。我喜欢只在我的 Guice 模块和静态 ( main()
) 方法中保留注入逻辑。这样,任何人都可以使用我的类,无论他们是否也使用 Guice 或其他框架。
更新:
您可以通过使用DEVELOPMENT
阶段解决#3,这将避免预先检查是否提供了所有注射。但是,这可能不是一个好主意 - 运行PRODUCTION
并接受编写无用提供程序的打击会更干净。
还有最后一种方法您可能想尝试也可能不想尝试:您当前是否B
在注入器上安装 's 模块,以便从中获取所需的类B
?如果是这样,您可以考虑不安装B
's 模块,而是将所需的提供程序添加到您自己的模块中,省略任何您不需要的(即有问题的)。但是,我不能保证这会解决您的问题,而无需查看您的代码:)
推荐阅读
- c++98 - 分配给结构内的引用
- python - 无法在 spyder 中导入张量流
- javascript - 未通过 XMLHttpRequest 发送数据
- javascript - 如何遍历具有嵌套对象的 json 对象以获取所需的数据
- twitter-bootstrap - 如何修复加载资源失败:在 Bootstrap 3 SASS 上加载 Glyphicons 字体时出现 404(未找到)错误
- python - 我无法从 picamera 流式传输图像
- c# - Microsoft Graph 和无用户访问
- python-2.7 - ValueError:形状(1,4)和(5,4)未对齐:4(dim 1)!= 5(dim 0),将我的变量添加到我的预测机器时
- apache-spark - Scala-Spark:过滤 DataFrame 性能和优化
- rest - 403 Forbidden for SharePoint version APIs 但它们在设计时工作并且所有其他 REST 调用工作