Являются ли CDI.current (). Select (). Get () и BeanManager.getReference () функционально эквивалентными? - PullRequest
0 голосов
/ 29 октября 2018

В контексте JEE / CDI я обычно использую статическую функцию CDI, когда мне нужно статически получить управляемый компонент CDI из метода. Например:

MyBean myBean = CDI.current().select( MyBean.class ).get()

Однако, насколько я могу судить, другой эквивалентный способ сделать это - использовать BeanManager:

BeanManger bm = new InitialContext().lookup( "java:comp/BeanManager" );
Bean<?> bean = bm.resolve(bm.getBeans( MyBean.class ) );
CreationalContext<?> context = bm.createCreationalContext(bean);
MyBean myBean = bm.getReference(bean, cls, context);

Итак, кроме того, что при написании с использованием метода CDI.current() значительно меньше кода, какие есть различия в его использовании? Казалось бы, возврат к использованию BeanManager - это гораздо более сложная (и потенциально подверженная ошибкам?) Методология. С функциональной точки зрения, есть ли недостатки в использовании метода CDI.current()? CDI...select() работает только для компонента @ApplicationScope? Или я могу также использовать с другими компонентами (например: @Dependent)?

Я помню, что читал что-то о возможной утечке памяти, используя метод CDI, но не понимаю, как и почему это может иметь место.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Оба подхода дают схожий результат, однако есть два существенных различия.

  • CDI.current() - это то, что вы можете, где вы не можете просто @Inject BeanManager.
    • Это просто способ получить экземпляры CDI от не-cdi управляемого объекта
  • Instance.get() не принимает параметр CreationalContext, тогда как BM.getReference() делает.
    • Это принципиальное различие в том, что при использовании Instance, CreationalContext управляется контейнером - вам не нужно заботиться об этом, особенно об освобождении контекста. Если вы используете BM.getReference(), вам сначала нужно получить этот контекст, который обычно означает его создание, и который требует от вас также выпустить его, когда вы закончите работать с ним.
0 голосов
/ 31 октября 2018

Мы используем эти методы для доступа к CDI в вашем коде, отличном от CDI. в коде CDI мы можем внедрить BeanManager и ваши бины.

Поиск JNDI используется в CDI 1.0. после CDI 1.1 мы должны использовать класс CDI и его статические методы.

http://www.next -presso.com / 2016/02 / cdi-the-spi-the-spi-кто-любил-меня / говорит

В CDI 1.0 единственное решение, к которому у вас был доступ к графу bean-компонентов CDI, - это получение BeanManager из JNDI. ... Это многословие является доказательством того, что BeanManager является продвинутым инструментом CDI, позволяющим работать с базовой системой CDI echos. Очевидно, что это не лучшее решение, если вы просто хотите получить доступ к экземпляру. Вот почему в CDI 1.1 мы ввели абстрактный класс CDI, который использует Java Service Loader для извлечения конкретного класса CDI из реализации. ... Получение экземпляра становится таким же простым, как

CDI<Object> cdi = CDI.current();
MyService service = cdi.select(MyService.class).get();
...