4.1.6. Запуск кода на старте приложения
Иногда бывает необходимо выполнить некоторый код сразу после старта приложения в момент, когда все механизмы гарантированно работоспособны. Для этого можно воспользоваться слушателями событий жизненного цикла.
В данном разделе мы рассмотрим, как динамически зарегистрировать для сущности entity listener на старте приложения. Возьмем следующую задачу: в проекте имеется сущность Employee
(сотрудник компании), которая связана один-к-одному с платформенной сущностью User
(пользователь системы):
Если атрибут name
сущности User
изменяется, например через стандартный экран управления пользователями, необходимо, чтобы изменялся также и атрибут name
связанной сущности Employee
. Это обычная задача для "денормализованных" данных, и решается она, как правило, с использованием entity listeners. В данном случае ситуация осложняется тем, что необходимо отслеживать изменения не проектной, а платформенной сущности User
, и добавить entity listener с помощью аннотации @Listeners невозможно. Однако, можно добавить listener динамически через бин EntityListenerManager
, и сделать это лучше всего на старте приложения.
-
AppLifecycle.java - бин среднего слоя, слушающий события типа
AppContextInitializedEvent
. -
UserEntityListener.java - entity listener для сущности
User
.
В результате сразу после старта блока Middleware будет вызван метод initEntityListeners()
класса AppLifecycle
. В этом методе в качестве entity listener сущности User
регистрируется бин sample_UserEntityListener
.
Метод onBeforeUpdate()
класса UserEntityListener
будет вызываться перед каждым сохранением изменений экземпляров User
в базу данных. В методе проверяется, есть ли атрибут name
среди измененных, и если да, загружается связанный экземпляр Employee
, и в нем устанавливается это же значение name
.