2013-05-23 7 views
3

CDI позволяет пул в некотором роде? Потому что я думал, что это особенность бобов EJB, но Адам Бьен говорит в этом screencast, что контейнер выбирает, следует ли создавать новый экземпляр класса через отражение или использовать существующий. Так что, если у меня есть, например, эти два фасольCDI и пул

@RequestScoped 
public class RequestBean { 

    public void doIt() { 

    } 
} 

@SessionScoped 
public class SessionBean { 

    @Inject 
    private RequestBean bean;  

    public void doSomething() { 
     bean.doIt(); 
    } 
} 

вопрос - это всегда новый экземпляр RequestBean создается при вызове doSomething или же CDI контейнера какого-то образом управлять экземпляры в пуле?

ответ

10

Первый из них привязан к запросу, поэтому для каждого запроса создается новый экземпляр. Второй из них привязан к сеансу, поэтому для каждого сеанса создается новый.

CDI не объединяет и не перерабатывает объекты, поскольку не имеет понятия, являются ли объекты объектно-ориентированными или нет, и вы не хотите, чтобы в запросе возвращалось состояние, которое было у компонента в предыдущем запрос. Это разрушит весь смысл области запроса/сессии.

Если бобы на самом деле не стоят дорого (потому что они начинают новое соединение или что-то в этом роде), объединение их не приносит никаких преимуществ. Краткоживущие объекты очень быстро создают и собирают мусор в наши дни. И если bean действительно дорог для того чтобы создать, то оно должно быть, должно быть singleton.

+0

Хорошее объяснение, спасибо! –

+1

Но, может быть, один вопрос, основанный на том, что сказал, что такое пул фанатов без статусов в EJB, не то же самое? Я полагаю, что в контейнере создается компонент без состояния, помещая его в пул, а затем вынимает его по запросу а затем сбросьте все поля до нуля и верните их в пул. Итак, почему это работает с фасолью без статусов, а не с 'RequestScoped', я не уверен, могу ли я увидеть разницу. (EJB Faceless bean и CDI RequestScoped мне кажется довольно похожим) –

+1

Бит без статусов должен быть без гражданства. Поэтому у него не должно быть диалогового состояния, и разработчик знает, что если он что-то хранит в поле, он может вернуть его, когда он будет повторно использован позже. Если бы фанаты без гражданства были изобретены сейчас, они, вероятно, не были бы объединены. Но они были изобретены одновременно (около 2000 года), когда распределение объектов было не таким быстрым, как сейчас, и когда у нас не было всего опыта, который у нас есть сейчас. –