3.11.3. 扩展业务逻辑

平台业务逻辑的主要部分包含在 Spring bean 中。这样可以在应用程序中轻松地继承或重写它。

要替换 bean 实现,应该创建一个类来实现接口或继承平台基础类并在应用程序的spring.xml中注册它。不能将 @Component 注解用到于继承类;只能在 XML 配置中覆盖 bean。

下面是向PersistenceTools bean 添加方法的示例。

首先,创建一个带有必要方法的类:

  1. public class ExtPersistenceTools extends PersistenceTools {
  2. public Entity reloadInSeparateTransaction(final Entity entity, final String... viewNames) {
  3. Entity result = persistence.createTransaction().execute(new Transaction.Callable<Entity>() {
  4. @Override
  5. public Entity call(EntityManager em) {
  6. return em.reload(entity, viewNames);
  7. }
  8. });
  9. return result;
  10. }
  11. }

在项目 core 模块的 spring.xml 中注册类,其标识符与平台 bean 相同:

  1. <bean id="cuba_PersistenceTools" class="com.sample.sales.core.ExtPersistenceTools"/>

之后,Spring 上下文将始终返回 ExtPersistenceTools 实例而不是基类 PersistenceTools 的 实例。检查代码示例:

  1. Persistence persistence;
  2. PersistenceTools tools;
  3. persistence = AppBeans.get(Persistence.class);
  4. tools = persistence.getTools();
  5. assertTrue(tools instanceof ExtPersistenceTools);
  6. tools = AppBeans.get(PersistenceTools.class);
  7. assertTrue(tools instanceof ExtPersistenceTools);
  8. tools = AppBeans.get(PersistenceTools.NAME);
  9. assertTrue(tools instanceof ExtPersistenceTools);

可以使用相同的逻辑来重写应用程序组件中的服务,例如:要替换 bean 实现,应该创建一个类,这个类扩展基础服务功能。在下面的示例中,创建了一个新类 NewOrderServiceBean ,并重写基类 OrderServiceBean 中的方法:

  1. public class NewOrderServiceBean extends OrderServiceBean {
  2. @Override
  3. public BigDecimal calculateOrderAmount(Order order) {
  4. BigDecimal total = super.calculateOrderAmount(order);
  5. BigDecimal vatPercent = new BigDecimal(0.18);
  6. return total.multiply(BigDecimal.ONE.add(vatPercent));
  7. }
  8. }

然后,如果在 spring.xml 中注册新创建的这个类,平台将会使用新的实现代替旧的实现 OrderServiceBean 。请注意,注册新的 bean 时,id 属性应该与应用程序组件中的基础服务的 id 一致,在 class 属性中指定新类的完全限定名:

  1. <bean id="workshop_OrderService" class="com.company.retail.service.NewOrderServiceBean"/>