2013-06-23 3 views
2

Я новичок в EJB. Я слышал, что в некоторых случаях приемлемо хранить некоторую информацию (такую ​​как конфигурации) в фазах без состояния. Насколько я понимаю, жизненный цикл вещественного компонента начинается с вызова метода bean и заканчивается на выводе метода. После того, как метод завершится, фаза без состояния будет возвращена в пул.Бланфик без гражданства: частная переинтериализация поля

  1. Я хочу знать, если конфигурации поле будет повторной инициализации каждый раз, когда метод бина вызывается или только на создание компонента.
  2. Также я хочу знать, какую еще информацию можно хранить в частных частных бэкбонах.
@Stateless 
public class MyBean { 

    private String config = ....; 

    //..... 
} 

Спасибо заранее.

ответ

2
  1. The private String config = ... будет ininialized только один раз для каждого экземпляра боба, когда он создается (обычно при запуске приложения, но также возможно, когда сервер приложений решает, что больше зерна необходимы для обработки растущего трафика).

  2. В принципе, когда вы выполняете метод public bean, вы гарантированно являетесь единственным исполнителем этого экземпляра компонента. За это время вам разрешено хранить что-либо в частных переменных. Однако, как только вы вернетесь к коду, который вызвал ваш bean-компонент, вам никогда не гарантируется, что последующие вызовы будут направлены в один и тот же экземпляр.

Пример:

@Stateless 
public class MyBean implements MyBeanIntf { 

    private Object state; 

    @Override 
    public void beanMethod() { 
     state = new Object(); 
     privateMethod(); 
    } 

    private void privateMethod() { 
     // it's safe to access 'state' here, will be the one set in 
     // beanMethod() 
    } 

    @Override 
    public void otherMethod() { 

    } 
} 

@Stateless 
public void MyBeanClient { 
    @EJB 
    private MyBean myBean; 

    someMethod() { 
     myBean.beanMethod(); 
     // Not necessarily the same instance that executed beanMethod 
     // will execute otherMethod 
     myBean.otherMethod(); 
    } 
} 

Это теория. На практике я бы избегал кода, который полагался бы на сохранение внутреннего временного состояния в EJB без сохранения состояния - только потому, что этот стиль предлагает другим программистам, что в целом нормально иметь состояние SLSB, что приводит к запутыванию кода и потенциальных ошибок (если состояние из предыдущих исполнений ошибочно воспринимается как текущее).

+0

Спасибо, он мне многое объясняет. Но я не совсем понимаю, что «myBean.beanMethod()» может выполняться на двух разных компонентах. Как я понимаю, инъекция выполняется только один раз при инициализации MyBeanClient. Как можно повторить инициализацию одного из его полей? –

+1

Вам не нужно повторно инициализировать введенные поля - вы можете думать о них, как всегда готовы к вам. Что касается других - вы можете написать перехватчик, чтобы сделать это перед каждым вызовом общественного метода. Проверьте ключевые слова «EJB interceptors» и «@AroundInvoke». – MaDa

+0

Извините, я задал неправильный вопрос. Я имею в виду, как бывает, что поле myBean (в вашем примере) ** изменяет ** экземпляр компонента без состояния ** на лету **? И спасибо за перехватчики, никогда не знал об этом. –