Канонический способ получения экземпляра управляемого компонента 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 чаще показываются во фрагментах и чаще рекомендуются в качестве решения, но это только излишне создает новый прокси, даже если он уже существует.