2015-06-23 3 views
0

представьте себе, продюсер для SessionFactory (в качестве примера):CDI - Производители и Отборочный не на вырабатываемый объекте

@Produces public SessionFactory produceSessionFactory(){} 

Нет у меня есть второй производитель, который производит какой-либо другой объект, позволяет сказать DatabaseObject, и нужна ссылка на SessionFactory:

@Produces 
public DatabaseObject produceDatabaseObject(SessionFactory factory){} 

Нет, я могу использовать мой объект базы данных, как, что:

@Inject 
DatabaseObject object; 

Пока, так хорошо. Поэтому давайте предположим, что этот материал реализован в рамках и будет использоваться несколькими приложениями.

Теперь одно приложение решает, что хочет использовать другой SessionFactory, поэтому он реализует свой собственный продюсер и спецификатор:

@Produces 
@CustomQualifier 
public SessionFactory produceSessionFactory(){} 

Но сейчас, насколько я знаю, я не мог использовать DatabaseObject с классификатором , потому что, разумеется, квалификатор используется только для продюсера для SessionFactory. Так что это не будет работать:

@Inject 
@CustomQualifier 
DatabaseObject object; 

Следствием применения придется переопределять производителя DatabaseObject, имеющие абсолютно тот же код, или расширение базового производителя и просто добавить спецификатор:

@Produces 
@CustomQualifier 
public DatabaseObject produceDatabaseObject(@CustomQualifier SessionFactory factory){ 
    return super.produceDatabaseObject(factory); 
} 

Это как-то производит код с моей точки зрения и становится веселым, если у вас много производителей.

Есть ли способ достичь этого без необходимости переопределения производителя? Так что в основном метод производителя вводит SessionFactory в отношении квалификатора на объект, который он производит?

Спасибо!

ответ

0

Вы можете использовать InjectionPoint у ваших производителей, чтобы получить квалификаторы и создать соответствующие экземпляры (например, https://docs.jboss.org/weld/reference/latest/en-US/html/injection.html#_the_literal_injectionpoint_literal_object).

В качестве альтернативы создайте переносное расширение. Поступая таким образом, вы можете зарегистрировать/создать собственные компоненты. Создание расширений всего за пару бобов может оказаться слишком дорогостоящим для слишком низкой выгоды, но посмотрите на себя здесь: https://docs.jboss.org/weld/reference/latest/en-US/html/extend.html#_registering_a_literal_bean_literal

+0

Но точка инъекции не решит проблему, поскольку мне все еще потребуется реализовать соответствующего производителя. В противном случае я получу неудовлетворенную ошибку зависимости на этапе проверки запуска? По последним причинам мне нужно будет предоставить вторую аннотацию без квалификатора, содержащую квалификатор SessionFactory, как параметр не привязывающего класса. Это как-то странно для «пользователя», я думаю .. – JDC

Смежные вопросы