Więc po wielu kopanie wokół okazało się, że wiosna obsługuje JSR-330. Ten JSR definiuje prosty interfejs API - cała specyfikacja jest dosłownie właśnie tym interfejsem API - który standaryzuje kilka interfejsów, adnotacji i zachowań zależnych od zależności.
W przeciwieństwie do interfejsu Spring FactoryBean
, interfejs javax.inject.Provider
nie generuje wyjątku podczas pobierania odwołania do komponentu bean. Co więcej, nadal będziesz musiał zdefiniować to FactoryBean w pewnym miejscu (odczytać klasę XML lub @Configuration
, a to jest nieoptymalne).
Z powodu błędu, w aktualnym Spring 3.1.1, javax.inject.Provider nie działa. To działa pod numerem wiosną 3.1.0.
W celu wykorzystania go ty prosty konieczność uwzględnienia słoik javax.inject - jeśli używasz Maven można:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Wiosna wykryje go, i od tego momentu można po prostu:
@Inject
Provider<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();
podobnie jak w przykładzie Guice, ponieważ jest to ten sam interfejs API.
Pomimo mojego poprzedniego komentarza do Konstantina, wiosna powoduje, że dostawca sam tworzy usługę. (Testowałem to w stosunku do Spring 3.1.1 i działałem na to Spring Provider regression issue)
+1 Dobra odpowiedź. –
Obawiam się, że między dostawcą <> a wystąpieniem <> są znaczące różnice (mam nadzieję, że się mylę). Po pierwsze: Instance implementuje Iterable i ma to duży wpływ na to, jak z niego korzystasz. Na przykład. regularnym użyciem dla mnie jest deklarowanie instancji @Inject xxx ... więc będę mógł iterować poprzez instancje każdej klasy implementującej interfejs bez znajomej nazwy klasy. Chcę wiedzieć, jak to zrobić, korzystając z dostawcy. –
Rafael
'Instance <>' nie jest częścią JSR-330 i nie jest częścią Spring. Problemem, który wówczas miałem, było uzyskanie fasoli prototypowej (zależnej od niektórych zmiennych kontekstowych), bez konieczności wstrzymywania samego kontekstu aplikacji. –