Основная часть бизнес-логики платформы сосредоточена в бинах Spring, что позволяет легко расширить или переопределить ее в приложении.
Для подмены реализации бина достаточно создать свой класс, реализующий интерфейс или расширяющий базовый класс платформы,
и зарегистрировать его в
spring.xml
приложения. Аннотацию @ManagedBean
в расширяющем классе применять нельзя, переопределение бинов возможно только с помощью конфигурации в XML.
Рассмотрим пример добавления метода в бин
PersistenceTools
.
Создаем класс с нужным методом:
public class ExtPersistenceTools extends PersistenceTools { public Entity reloadInSeparateTransaction(final Entity entity, final String... viewNames) { Entity result = persistence.createTransaction().execute(new Transaction.Callable<Entity>() { @Override public Entity call(EntityManager em) { return em.reload(entity, viewNames); } }); return result; } }
Регистрируем класс в spring.xml
модуля core проекта с тем же идентификатором, что и бин платформы:
<bean id="cuba_PersistenceTools" class="com.sample.sales.core.ExtPersistenceTools"/>
После этого контекст Spring вместо экземпляра базового класса PersistenceTools
будет всегда возвращать ExtPersistenceTools
, например:
Persistence persistence; PersistenceTools tools; persistence = AppBeans.get(Persistence.class); tools = persistence.getTools(); assertTrue(tools instanceof ExtPersistenceTools); tools = AppBeans.get(PersistenceTools.class); assertTrue(tools instanceof ExtPersistenceTools); tools = AppBeans.get(PersistenceTools.NAME); assertTrue(tools instanceof ExtPersistenceTools);