Я хочу использовать одноэлементный класс в сопутствующем объекте Scala, но я использую внедрение зависимостей Guice, и, насколько мне известно, он не используется явно в этих сценариях.
В качестве примера предположим, что у нас есть класс Singleton (с использованием Guice) следующим образом:
@Singleton
class Foo Inject()(foo2: Foo2) {
def func = { ... }
}
Я могу использовать его в других классах как:
class MyClass Inject()(foo: Foo) {
foo.func()
}
А как насчет объектов? Мне нужно создать экземпляр с new как:
object MyObject {
val foo2 = new Foo2()
val foo = new Foo(foo2)
foo.func()
}
В таком случае, есть ли у Foo только один экземпляр? Я имею в виду, возвращает ли new Foo(foo2) тот же экземпляр, что и Guice в @Inject()(foo: Foo)?
Кстати, по этому поводу уже есть вопросы (например, ссылка на сайт), но я хочу использовать объекты и получить доступ к экземплярам синглтонов внутри них.





In this case, does Foo still have just one instance? I mean, does new Foo(foo2) return the same instance as Guice returns in @Inject()(foo: Foo)?
Нет. Так же, как если бы вы позвонили в new Foo(...) в другом месте. Я предлагаю просто не смешивать это; если вы хотите использовать экземпляры Guice внутри MyObject, сделайте его также одноэлементным классом Guice. Или сделайте Fooobject, вы все равно можете получить к нему доступ из классов, использующих Guice.
Если вам это действительно нужно, то, как я могу думать, действительно некрасиво; для хранения Injector с вашего main (или где бы вы его не создавали) где MyObject может получить к нему доступ, т.е.
object Main {
var injector: Injector = null
def main(args: Array[String]): Unit = {
// make sure this happens before MyObject is accessed
injector = Guice.createInjector(...)
...
}
}
object MyObject {
val foo = Main.injector.getInstance(classOf[Foo])
foo.func()
}
Если вы даже не создаете Injector самостоятельно, а используете какой-то фреймворк, в котором используется Guice, проверьте, дает ли он вам доступ к Injector.
Спасибо! Мы используем Play Framework. Наверное, мне нужно получить инжектор из Play.