2016-01-11 4 views
0

Мы используем CDI в нашем приложении (НЕ EJB). У нас есть слой ресурсов, слой бизнес-бобы и слой обработчика бланков базы данных. Все эти бобы: @RequestScoped. Сейчас ресурс внедряет бизнес-компонент, который, в свою очередь, вводит все необходимые ему бобы dbhandler. Так как это CDI, и нет пула объектов (по крайней мере, из того, что я знаю), есть ли способ решить, какие бобы будут впрыскиваться (и, следовательно, созданы) в зависимости от метода? Например, у меня есть два бизнес-компонента. Метод 1 использует DAOBean1, а Method2 использует DAOBean1 AND DAOBean2. Прямо сейчас, даже если я только хочу использовать Method1, бизнес-компонент будет вводить обе БД DAO. Есть ли способ фильтровать впрыскиваемые бобы в соответствии с вызовом метода? Это важно, потому что у нас есть компонент, который создает соединение с источником данных на его @PostConstruct, но не все методы bean обрабатывают базу данных, что означает, что мы создаем избыточные соединения при использовании компонента для не связанных с db методов.Ввод различных бобов в соответствии с методом ресурса под названием

+1

Похоже, предпочтительным вариантом является инъекции пула соединений. – chrylis

+0

Ну, простое исправление заключается в том, чтобы не вводить DAOBean2, а скорее искать его программно через CDI BeanManager. Затем вы получаете создание боба по требованию. – Gimby

+0

Это хорошие обходные пути, но я ищу решение описанной проблемы. Проблема подключения - это всего лишь одна проблема, которая возникает из-за нефильтрованной инъекции бобов. – Konstantine

ответ

0

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