Что такое эквивалент Spring для экземпляра CDI или поставщика Guices

В 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 вопрос о регрессии поставщика)