@Autowired vs @Inject

0

Przerabiam książkę Spring in Action i natrafiłem na przykład w którym komponent jest wstrzykiwany poprzez Provider i zapisuję do listy

 @Inject
	public GuitarPlayer(Provider<Instrument> ins) {
		instruments = new LinkedList<Instrument>();
		for (int i = 0; i < 5; i++) {
			instruments.add(ins.get());
		}
	}

Moje pytanie to czy różnica między tym a wstrzykiwaniem przez @Autowired polega na tym, że w przypadku @Inject każdy element listy będzie osobną instancją?
Jeśli tak to w jaki sposób w pliku xml mógłbym wstrzykiwać do tej listy różne klasy które implementuję ten sam interfejs?

1

Żadnej różnicy nie ma. @Inject to po prostu standard. @Autowired może przyjąć parametr required.

1

Inject to standard: specyfikacja JSR-330.

Zacytuje siebie:

Od siebie dodam, że zarówno @Inject jak i @Autowired jest poprawne i nie trzeba używać standardu: po prostu @Inject to standard JSR-330. Oznacza to, że @Inject jest dostępny w wielu różnych dostawcach DI np. Weld, Guice czy Spring. W praktyce raczej nie spotka się sytuacji, że w aplikacji będziesz zmieniał kontener DI.

Z praktycznego punktu widzenia jest jeszcze różnica taka, @Autowired ma opcjonalny parametr required (domyśnie false). Jak go ustawisz na true zachowa się jak @Inject: zwróci wyjątek jak zależność nie zostanie znaleziona.

Generyczny serwis dla operacji CRUD.

Przykład, który przytoczyłeś jest dziwny. Generalnie za DI stoi metoa fabryczna (pod spodem), która tworzy obiekty. Jak chcesz, aby w Spring każdy singleton miał inną instancję wstrzykiwanego obiektu potrzebujesz prototype scope. Aby móc używać DI musisz korzystać z obiektów zarządzanych przez Spring.

Domyślnie w Springu każdy obiekt nie jest osobną instancją, a singletonem. Warto przeczytać: http://slawekturowicz.blogspot.com/2011/05/spring-singleton-vs-prototype-scope.html

0

Chyba rzeczywiście pomyliłem. Jeśli dobrze rozumiem singleton to tak jakby gwarant istnienia tylko jednej instancji danej klasy a ja chciałem utworzyć kilka... Swoją drogą w jaki sposób można by to zrobić?

EDIT: Nie zauważyłem linka, nie ma pytania ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1