哪个是在spring框架中编写控制器,dao和服务的最佳方法?

时间:2017-01-05 07:18:58

标签: spring spring-mvc spring-boot

例如,我们有一个模型Product,网页可以插入产品并在一个请求中返回所有产品。

下面的方法哪个是编写控制器,dao和服务的最佳方法?为什么?

A:

@Repository
public class ProductDaoImpl implements ...{
   @Override
   public List<Product> findAll(){
       // return all product
   }
   @Override
   public void insert(Product product){
       // just insert a product
   }
}

@Service
public class ProductServiceImpl implements ...{
   @Autowired
   private ProductDao dao;

   @Override
   public List<Product> insertAndFindAll(Product product){
       dao.insert(product);
       return dao.findAll();
   }
}

@Controller
public class ProductController{
    @Autowired
    private ProductService productService;

    @RequestMapping(...)
    public @ResponseBody List<Product> insertAndFindAll(@RequestBody Product product){
        return productService.insertAndFindAll(product);
    }
}

B:

@Repository
public class ProductDaoImpl implements ...{
   @Override
   public List<Product> findAll(){
       // return all product
   }
   @Override
   public void insert(Product product){
       // just insert a product
   }
}

@Service
public class ProductServiceImpl implements ...{
   @Autowired
   private ProductDao dao;

   @Override
   public List<Product> findAll(){
       return dao.findAll();
   }
   @Override
   public void insert(Product product){
       dao.insert(product);
   }
}

@Controller
public class ProductController{
    @Autowired
    private ProductService productService;

    @RequestMapping(...)
    public @ResponseBody List<Product> insertAndFindAll(@RequestBody Product product){
        productService.insert(product);
        return productService.findAll(product);
    }
}

3 个答案:

答案 0 :(得分:0)

如果您正在考虑在服务层中应用事务管理器,那么我认为将insertfindAll service方法分开是一个好习惯,因为这两种操作都是不同。因此,考虑B中的此方法优于A

关于您的设计的另一件事,您可以并且我认为您应该从客户端的findAll请求中分离出insert请求。  您可以重定向到其他请求映射,该映射仅处理findAll的请求。

在上面提到的两种方法中都会清楚地表明每个控制器方法都处理一个独特的请求,并且是一个更好的设计。

答案 1 :(得分:0)

我的建议是选择B,尽管我建议对控制器进行一些小改动。
选项B中的“Controller”可以有两种方法,一种是插入产品,另一种是查找所有产品。 “insertProduct”方法将返回“findAll”等路径,该路径与“findAllProducts”方法上的RequestMapping相匹配。

答案 2 :(得分:0)

如果逻辑仅涉及用户界面,则它属于表示层(控制器)。如果它是核心业务逻辑,则它属于服务层。

在您的示例中,查找所有产品可能与插入无关,只是因为您希望在插入新产品后显示产品列表。所以这是一个UI的东西,属于控制器。

如果这两个步骤是更新存储的产品数量并插入一个属于服务层的订单。