Auto使用Guice绑定所有`Services`

时间:2017-02-21 21:50:21

标签: java c# guice

我最近在.Net编写了7年后开始使用Java,不要误解我爱C#但是需要工作,我需要改变。

我的问题是关于Ioc注册,在C#中我使用过Windsor和SimpleInjector(我非常喜欢),在java中我想开始使用Guice。

我正在进行的项目是一个遗留项目,不会使用Ioc,它是泽西项目(具有非功能性HK2 IOC)。

现在对于我的问题,在C#上我已经在运行时使用反射注册了所有接口和具体实现。

我已经阅读了Guice文档,找不到任何示例,并且JIT绑定并不是真正理解的。

那么可以吗?这是最好的做法吗? (我不认为手动编写所有绑定是正确的方法)

任何示例或方向都会非常有用

谢谢

1 个答案:

答案 0 :(得分:3)

在Java和Guice中比在其他平台上更难做到:Java类加载器的设计比finding classes by their package/name with fallbacks更多,而不是枚举类路径上的每个类或实现。虽然在规定的条件下(例如ReflectionsGoogle Guava)存在一些库解决方案来执行后者,但通常不可能通过当前的ClassLoader及其父级迭代每个可用的类,因为该集在理论上是无限的通过URLClassLoader和类似的基于网络的类加载器。

这使得通常并且经常需要明确列出您的接口和实现以向您的应用程序公开,无论您是否使用Guice。

请参阅:

因此,很难完成诸如"启动每个可实现MyStartableService"的可到达类的任务,但是通过Guice SPI你可能会有更多好运"启动每个请求的MyStartableService Guice在回归之前"。或者,您也可以使用Java 6中内置的Java SPI framework(例如ServiceLoader)来允许分片或分布的适当服务列表,然后通过调用{{}}来提供给Guice。 {1}}在模块中。 (Olivier在评论中恰当地建议AutoService,这样可以轻松生成为ServiceLoader提供支持的元数据文件。)