В CDI вы можете определить объект, который даст вам элементы определенного типа, используя:
@Inject
Instance<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();
Аналогично в Guice вы можете сделать:
@Inject
Provider<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();
Мне интересно, есть ли подобная конструкция в Spring, или вы должны использовать ApplicationContext
, чтобы получить ссылку?
Ответ 1
Итак, после многократного поиска я узнал, что Spring поддерживает JSR-330. Этот JSR определяет простой API - вся спецификация - это просто этот API, который стандартизирует несколько интерфейсов инъекций зависимостей, аннотаций и поведения.
В отличие от Spring FactoryBean
интерфейс javax.inject.Provider
не выбрасывает Исключение при получении ссылки bean. Кроме того, вам все равно необходимо определить этот FactoryBean в некотором месте (читайте XML или класс @Configuration
, и это субоптимально).
Из-за ошибки, в текущем Spring 3.1.1, javax.inject.Provider не работает. Он работает в Spring 3.1.0.
Чтобы использовать его, вам просто нужно включить javax.inject jar - если вы используете maven, вы можете:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
Spring обнаружит его, и с этого момента вы можете просто:
@Inject
Provider<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();
как в примере Guice, так как это тот же API.
Несмотря на мой предыдущий комментарий Константину, Spring сам создает Поставщика. (Я тестировал его против Spring 3.1.1 и запускал этот Spring вопрос о регрессии поставщика)
Ответ 2
Звучит как FactoryBean