Google Guice каждый раз возвращает новый экземпляр - PullRequest
0 голосов
/ 06 мая 2018

Я новичок в Dependency Injection, и недавно мне пришлось выучить Spring и Guice. Вопрос ниже может быть довольно хромым.

Spring позволяет создавать объекты-прототипы с аннотацией @Scope ("prototype"), означающей, что каждый раз возвращается новый объект

Например, в моем пружинном контейнере: -

@Scope("prototype")
@Bean
A getA(){
   return new A();
}

И новый объект A вводится во всех ссылках @ autowired.

class B {
  @Autowired
  A objA;
}

Однако в инжекторе guice вводится тот же экземпляр. Похоже, что guice предоставляет только одноэлементные области, области запросов или сеансов https://github.com/google/guice/wiki/Scopes. Мое приложение не является точно веб-службой, и мне интересно, как внедрить новые экземпляры объекта везде. Я читал, что провайдер можно использовать, но я не смог найти ни одного слабого / простого примера для понимания.

Как я могу ввести новые экземпляры A в B или любой другой класс? С Guice, в настоящее время я могу внедрить только один экземпляр со всеми классами, как показано ниже в контейнере guice

bind(A.Class).toInstance(new A());
new B(); // or create with other ways 

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Просто используйте без привязки

Привязка по умолчанию создает новый экземпляр каждый раз, когда он внедряется.

Вам не нужно ничего декларировать:

import com.google.inject.*;

class Main {
  static class B {
    @Inject A a;
  }
  public static void main(String[] args) {
    Injector injector = Guice.createInjector();
    B b1 = injector.getInstance(B.class);
    B b2 = injector.getInstance(B.class);

    System.out.println(b1.a == b2.a); // Prints "false"
  }
}
0 голосов
/ 06 мая 2018

Желаемое поведение по умолчанию - guice, поэтому вы каждый раз получаете новый экземпляр, если явно не переключаетесь на singleton.

И это то, что вы делаете, когда связываетесь с экземпляром. Вы говорите обманчиво: «Когда-нибудь, когда кому-то понадобится экземпляр A, дайте ему этот (тот, который создан с помощью« new »).

Если вы просто хотите, чтобы новый A вводился всякий раз, когда вы строите B, не указывайте никакого поведения в модуле, просто позвольте A иметь конструктор, аннотированный @ Inject.

...