Мы используем CDI
в нашем приложении (НЕ EJB
). У нас есть слой ресурсов, слой бизнес-бобы и слой обработчика бланков базы данных. Все эти бобы: @RequestScoped
. Сейчас ресурс внедряет бизнес-компонент, который, в свою очередь, вводит все необходимые ему бобы dbhandler. Так как это CDI
, и нет пула объектов (по крайней мере, из того, что я знаю), есть ли способ решить, какие бобы будут впрыскиваться (и, следовательно, созданы) в зависимости от метода? Например, у меня есть два бизнес-компонента. Метод 1 использует DAOBean1
, а Method2 использует DAOBean1
AND DAOBean2
. Прямо сейчас, даже если я только хочу использовать Method1, бизнес-компонент будет вводить обе БД DAO. Есть ли способ фильтровать впрыскиваемые бобы в соответствии с вызовом метода? Это важно, потому что у нас есть компонент, который создает соединение с источником данных на его @PostConstruct
, но не все методы bean обрабатывают базу данных, что означает, что мы создаем избыточные соединения при использовании компонента для не связанных с db методов.Ввод различных бобов в соответствии с методом ресурса под названием
ответ
Кажется, что нет способа использовать разные бобы в соответствии с вызванным методом. Так как инъекции разрешаются во время создания компонента, контейнер не может знать, какая функция будет вызвана и не сможет удержаться до инъекции, пока мы не решим. Чтобы решить эту проблему, мы либо используем Programmatic Bean Lookup (используя класс BeanManager
) для доступа к компонентам контекста, либо мы можем получить к ним доступ через интерфейс Instance<T>
. Если мы используем интерфейс Instance
, мы должны быть осторожны, чтобы не было утечек памяти. Почему это? Поскольку каждый компонент, введенный таким образом, получает область @Dependent
, что означает, что он будет выпущен, когда сам класс инжектора будет уничтожен. Если областью класса инжектора является, например, @ApplicationScoped
, сам компонент никогда не будет выпущен, что создаст утечку памяти. В таких случаях, как мы используем метод интерфейса Instance
, называемый `destroy (myBean).
Пример:
@ApplicationScoped
public class MyClass {
@Inject
Instance<MyBean> myBeanInstance;
public void myMethod() {
//...
MyBean bean = myBeanInstance.get();
// Do stuff with bean
myBeanInstance.destroy(bean); //Release the bean otherwise it will hold memory
}
}
- 1. autowire различных бобов в абстрактном классе
- 2. Нелегальный метод под названием
- 3. метод под названием mergeNumbers
- 4. не смог загрузить ник под названием "TwitterDrilldownView"
- 5. Используйте таблицу под названием «external»
- 6. контекста отсутствует под названием теста
- 7. Неверный метод перегрузки под названием
- 8. Rscript: Нет пакета под названием ...?
- 9. удалить файл под названием «.html»
- 10. Нет модуля под названием pyglet
- 11. Git branch под названием «--help»
- 12. Функция JavaScript под названием «действие»
- 13. Нет модуля под названием спектрограмма
- 14. Установить язык под названием JSON
- 15. Как получить __add__ под названием
- 16. unrecognized selector isPitched под названием
- 17. FacesComponent, без набора под названием
- 18. Не удалось найти раскадровку под названием «MainStoryboard_iPhone»
- 19. Моделирование темы под названием 0:
- 20. не член под названием dequeueReusableCellWithIdentifier
- 21. NLP Tagger под названием SENNA
- 22. Показать сообщения с тегом под названием
- 23. отображается под названием активности родителей
- 24. Чистый виртуальный метод под названием
- 25. DidSelect Аннотации, получаемые под названием
- 26. iOS Restkit needNewBodyStream под названием
- 27. нет пакета под названием 'rpart.plot'
- 28. Чистый виртуальный метод под названием
- 29. Не ожидается конструктор под названием
- 30. Класс под названием RGB в Visual C++
Похоже, предпочтительным вариантом является инъекции пула соединений. – chrylis
Ну, простое исправление заключается в том, чтобы не вводить DAOBean2, а скорее искать его программно через CDI BeanManager. Затем вы получаете создание боба по требованию. – Gimby
Это хорошие обходные пути, но я ищу решение описанной проблемы. Проблема подключения - это всего лишь одна проблема, которая возникает из-за нефильтрованной инъекции бобов. – Konstantine