Если речь идет о @Dependent
скошенных бобы, то есть a way documented in the CDI spec.
Общая идея заключается в том, что CDI позволяет вводить объект с именем InjectionPoint
, и из этого вы можете получить информацию о том, какой компонент был добавлен в этот компонент.
Вот короткий отрывок:
@Dependent //if you don't declare any scope, it's @Dependent by default
public class MyBean {
@Inject
InjectionPoint ip;
public void doStuff() {
// gives you the name of declaring class
ip.getMember().getDeclaringClass().getName();
}
}
В качестве альтернативы, вы можете использовать инъекции конструктора в вашем боба, чтобы справиться с этим при создании компонента. Это может быть ближе к тому, что вы стремитесь к возможно:
@Dependent //if you don't declare any scope, it's @Dependent by default
public class MyAnotherBean {
public MyAnotherBean(InjectionPoint ip) {
// CDI will inject InjectionPoint automatically
ip.getMember().getDeclaringClass().getName();
}
}
Опять же, обратите внимание, что это работает для @Dependent
только! Зачем? Ну, потому что @Dependent
создает новый экземпляр на точку инъекции и не использует прокси. Поэтому вы точно знаете, для кого вы создаете этот экземпляр. Другие области, такие как @RequestScoped
, @SessionScoped
и т. Д., Используют прокси-сервер, и поэтому вы создаете экземпляр только одного объекта в CDI и затем передаете прокси-серверы всякий раз, когда запрашивается инъекция.
Спасибо, это работает. Это действительно выглядит более элегантным решением! Спасибо за ваше четкое объяснение! – Bgvv1983
@ Bgvv1983 добро пожаловать. Кстати, я вижу, что вы определили свой собственный ответ как решение. Отвечает ли мой ответ на что-нибудь? Просто спрашиваю, могу ли я/мог предоставить дополнительную информацию :) – Siliarus
Hmzz кажется, что он не работает ip.getMember(). GetDeclaringClass(). GetName(); дает MyBean.class. – Bgvv1983