Раздел 3.3 CDI specification дает довольно хороший обзор высокого уровня использования @Produces
аннотацию:
Производитель метод выступает в качестве источника объектов, подлежащие закачиваемых, где:
• объекты, подлежащие инжекции, не обязательно должны быть экземплярами бобов, или
• конкретный тип объектов, подлежащих впрыску, может варьироваться во время выполнения, или
• объекты требуют некоторой пользовательской инициализации, которая не выполняется конструктором bean.
Допустим, например, что вы хотите, чтобы преодолеть между а Java EE управляемого компонента, как менеджер объекта и других компонентов CDI, вы можете использовать @Produces
аннотацию. Другим преимуществом является то, что вы избегаете дублирования аннотаций @PersistenceContext
на вашем уровне домена данных.
class A {
@PersistenceContext // This is a JPA annotation
@Produces // This is a CDI 'hook'
private EntityManager em;
}
class B {
@Inject // Now we can inject an entity manager
private EntityManager em;
}
Еще одна удобная польза для не денешься библиотек, которые не имеют CDI дружественные бобы (например, по умолчанию Конструкторы нет):
class SomeTPLClass {
public SomeTPLClass(String id) {
}
}
class SomeTPLClassProducer {
@Produces
public SomeTPLClass getInstance() {
return new SomeTPLClass("");
}
}
Javadoc для производит также показывает интересный (но довольно редко случай) производить именованный сбор, который может впоследствии быть введен в другие управляемые бобы (очень круто):
public class Shop {
@Produces @ApplicationScoped
@Catalog @Named("catalog")
private List<Product> products = new LinkedList<Product>(8);
//...
}
public class OrderProcessor {
@Inject
@Catalog
private List<Product> products;
}
контейнер отвечает за обработку всех методы nd, помеченные аннотацией @Produces, и обычно это будет делать, когда ваше приложение будет развернуто. Обработанные методы и поля затем будут использоваться как часть разрешения точки впрыска для управляемых компонентов, если это необходимо.
Это красота аннотации ... :) –