The private String config = ...
будет ininialized только один раз для каждого экземпляра боба, когда он создается (обычно при запуске приложения, но также возможно, когда сервер приложений решает, что больше зерна необходимы для обработки растущего трафика).
В принципе, когда вы выполняете метод 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, что приводит к запутыванию кода и потенциальных ошибок (если состояние из предыдущих исполнений ошибочно воспринимается как текущее).
Спасибо, он мне многое объясняет. Но я не совсем понимаю, что «myBean.beanMethod()» может выполняться на двух разных компонентах. Как я понимаю, инъекция выполняется только один раз при инициализации MyBeanClient. Как можно повторить инициализацию одного из его полей? –
Вам не нужно повторно инициализировать введенные поля - вы можете думать о них, как всегда готовы к вам. Что касается других - вы можете написать перехватчик, чтобы сделать это перед каждым вызовом общественного метода. Проверьте ключевые слова «EJB interceptors» и «@AroundInvoke». – MaDa
Извините, я задал неправильный вопрос. Я имею в виду, как бывает, что поле myBean (в вашем примере) ** изменяет ** экземпляр компонента без состояния ** на лету **? И спасибо за перехватчики, никогда не знал об этом. –