Канонический способ получения экземпляра управляемого компонента CDI: BeanManager # getReference () vs Context # get ()

Я понял, что есть два основных способа получить автоматически созданный экземпляр управляемого компонента CDI черезBeanManager когда толькоBean для начала (который создается на основеClass):

ОтBeanManager#getReference(), что чаще всего показано во фрагментах:

Bean bean = (Bean) beanManager.resolve(beanManager.getBeans(TestBean.class));
TestBean testBean1 = (TestBean) beanManager.getReference(bean, bean.getBeanClass(), beanManager.createCreationalContext(bean));

ОтContext#get(), что реже показывается во фрагментах:

Bean bean = (Bean) beanManager.resolve(beanManager.getBeans(TestBean.class));
TestBean testBean2 = beanManager.getContext(bean.getScope()).get(bean, beanManager.createCreationalContext(bean));

В результате они в конечном итоге делают одно и то же: возвращают прокси-ссылку на текущий экземпляр управляемого компонента CDI и автоматически создают экземпляр компонента, если это не так.т уже существует в объеме.

Но они делают это немного по-другому:BeanManager#getReference() всегда создает совершенно новый экземпляр прокси, в то время какContext#get() повторно использует существующий экземпляр прокси, если он уже был создан ранее. Это очевидно, когда приведенный выше код выполняется в методе действия существующегоTestBean пример:

System.out.println(testBean1 == testBean2); // false
System.out.println(testBean1 == this); // false
System.out.println(testBean2 == this); // true

Javadoc изContext#get() очень явно в этом:

Вернуть существующий экземпляр определенного контекстуального типа или создать новый экземпляр, вызвав Contextual.create (CreationalContext) и вернуть новый экземпляр.

в то время какJavadoc изBeanManager#getReference() не достаточно ясно об этом:

Получает контекстную ссылку для определенного компонента и определенного типа компонента.

Это меня запутало. Когда вы используете один или другой? Для обоих способов вынуженBean экземпляр в любом случае, из которого легко доступны класс bean-компонента и область действия bean-компонента, что требуется в качестве дополнительного аргумента. Я могу'не представляю, почему в этом конкретном случае их нужно будет поставлять извне.

Я могу представить, чтоContext#get() более эффективно использовать память, так как• Создайте ненужный другой экземпляр прокси, ссылающийся на тот же базовый экземпляр компонента, но просто найдите и повторно используйте существующий экземпляр прокси.

Это ставит меня к следующему вопросу: когда именноBeanManager#getReference() более полезный, чемContext#get()? Это's чаще показываются во фрагментах и чаще рекомендуются в качестве решения, но это только излишне создает новый прокси, даже если он уже существует.

Ответы на вопрос(3)

Ваш ответ на вопрос