3.4.1.1. 创建服务

服务接口的名称应以 Service 结尾,实现类的名称应以 ServiceBean 结尾。

CUBA Studio 能帮助轻松创建服务接口的脚手架代码和存根类。Studio 还会自动在 spring.xml 中注册新服务。要创建服务,请使用 CUBA 项目树的 Middleware 节点中的 New>Service 任务。

如果要手动创建服务,请按照以下步骤操作。

  1. global 模块中创建服务接口(因为服务接口必须在所有中可用),并在其中指定服务名称。建议使用以下格式指定名称:{project_name}_{interface_name}。例如:

    1. package com.sample.sales.core;
    2. import com.sample.sales.entity.Order;
    3. public interface OrderService {
    4. String NAME = "sales_OrderService";
    5. void calculateTotals(Order order);
    6. }
  2. core 模块中创建服务类,并使用接口中指定的名称向其添加 @org.springframework.stereotype.Service 注解:

    1. package com.sample.sales.core;
    2. import com.sample.sales.entity.Order;
    3. import org.springframework.stereotype.Service;
    4. @Service(OrderService.NAME)
    5. public class OrderServiceBean implements OrderService {
    6. @Override
    7. public void calculateTotals(Order order) {
    8. }
    9. }

作为Spring bean 的服务类应放在包的树结构中,其根目录需要在spring.xml文件的 context:component-scan 元素中指定。这时,spring.xml 文件会包含以下元素:

  1. <context:component-scan base-package="com.sample.sales"/>

这意味着将从 com.sample.sales 包开始搜索此应用程序 block 中带注解的 bean。

如果不同的服务或其它中间件组件需要调用相同的业务逻辑,则应将其提取并封装在适当的Spring bean中。例如:

  1. // service interface
  2. public interface SalesService {
  3. String NAME = "sample_SalesService";
  4. BigDecimal calculateSales(UUID customerId);
  5. }
  1. // service implementation
  2. @Service(SalesService.NAME)
  3. public class SalesServiceBean implements SalesService {
  4. @Inject
  5. private SalesCalculator salesCalculator;
  6. @Transactional
  7. @Override
  8. public BigDecimal calculateSales(UUID customerId) {
  9. return salesCalculator.calculateSales(customerId);
  10. }
  11. }
  1. // managed bean encapsulating business logic
  2. @Component
  3. public class SalesCalculator {
  4. @Inject
  5. private Persistence persistence;
  6. public BigDecimal calculateSales(UUID customerId) {
  7. Query query = persistence.getEntityManager().createQuery(
  8. "select sum(o.amount) from sample_Order o where o.customer.id = :customerId");
  9. query.setParameter("customerId", customerId);
  10. return (BigDecimal) query.getFirstResult();
  11. }
  12. }