Смысл @PostConstruct
состоит в том, чтобы обеспечить ловушку для выполнения некоторого кода после того, как установлены все управляемые свойства (как в <managed-property>
или @ManagedProperty
), и все внедрения зависимостей (например, * 1006)*, @Resource
, @Inject
и т. Д.).
Если у вас их нет, просто используйте конструктор бина.
public class Bean {
public Bean() {
// Just do your job here. Don't do it the hard way.
}
// ...
}
Или есливы действительно хотите выполнить его, когда определенное свойство было установлено, затем выполните задание в установщике, одновременно проверяя текущее значение свойства на ноль.
public class Bean {
private SomeObject someManagedProperty;
public void setSomeManagedProperty(someManagedProperty) {
if (this.someManagedProperty == null && someManagedProperty != null) {
// First-time set, now you can do your job here.
}
this.someManagedProperty = someManagedProperty;
}
// ...
}
Обновить каксогласно комментариям:
Я имел в виду выполнять метод каждый раз при загрузке страницы
@PostConstruct
этого не делает.Однако, если bean-компонент находится в области запроса, вы увидите тот же эффект.Похоже, вы используете управляемый bean-объект области действия для сеанса или приложения для управления данными области запроса.Это по сути неправильно.Вы должны преобразовать его в bean-объект области видимости запроса.Любые реальные данные сессий области могут быть разделены на сессионный компонент, который вы затем вводите с помощью <managed-property>
.