目录
一、案例背景引入
外卖项目中,菜品分类删除,当要删除的分类,关联了菜品或者套餐。则删除失败
1.1自建CategoryService(service接口)
mybatisplus提供的基础方法,无法满足我们的需求,接口中添加remove抽象方法
public interface CategoryService extends IService<Category> {
public void remove(Long id);
}
1.2自建CategoryServiceImpl(service接口实现类)
@Service
public class CategoryServiceImpl extends ServiceImpl<CategoryMapper,Category> implements CategoryService{
@Autowired
private DishService dishService;
@Autowired
private SetmealService setmealService;
/**
* 根据id删除分类,删除之前需要进行判断
* 注释remove方法,分类管理页面,点击删除
* 在浏览器控制台可以看到报错请求http://localhost:8080/category?id=1397844263642378242
* @param id
*/
@Override
public void remove(Long id) {
LambdaQueryWrapper<Dish> dishLambdaQueryWrapper = new LambdaQueryWrapper<>();
//添加查询条件,根据分类id进行查询
dishLambdaQueryWrapper.eq(Dish::getCategoryId,id);
int count1 = dishService.count(dishLambdaQueryWrapper);
//查询当前分类是否关联了菜品,如果已经关联,抛出一个业务异常
if(count1 > 0){
//已经关联菜品,抛出一个业务异常
throw new CustomException("当前分类下关联了菜品,不能删除");
}
//查询当前分类是否关联了套餐,如果已经关联,抛出一个业务异常
LambdaQueryWrapper<Setmeal> setmealLambdaQueryWrapper = new LambdaQueryWrapper<>();
//添加查询条件,根据分类id进行查询
setmealLambdaQueryWrapper.eq(Setmeal::getCategoryId,id);
int count2 = setmealService.count();
if(count2 > 0){
//已经关联套餐,抛出一个业务异常
throw new CustomException("当前分类下关联了套餐,不能删除");
}
//正常删除分类
super.removeById(id);
}
}
1.3自建CategoryController(controller控制类)
@RestController
@RequestMapping("/category")
@Slf4j
public class CategoryController {
//依赖注入
@Autowired
private CategoryService categoryService;
/**
* 根据id删除分类
* 注释delete方法,分类管理页面,点击删除
* 在浏览器控制台可以看到报错请求http://localhost:8080/category?id=1397844263642378242
* @param id
* @return
*/
@DeleteMapping
public R<String> delete(Long id){
log.info("删除分类,id为:{}",id);
//在delete方法中直接调用categoryService中我们自定义的remove方法
categoryService.remove(id);
return R.success("分类信息删除成功");
}
}
二、符合依赖注入的设计原则。
为什么CategoryController(controller控制类)不调用categoryServiceImpl.remove(id);而是调用categoryService.remove(id);
在Spring框架中,通常建议通过接口(service接口)来引用服务,而不是直接引用接口的实现类(service接口实现类)。
这样做的好处是,根据开发需求,只用更改接口实现类(service接口实现类),而不用修改CategoryController(controller控制类)内部的代码。你的代码会更加灵活,这是一种编程的最佳实践,符合依赖注入的设计原则。
根据注入的接口,找到接口的实现类,是框架实现的。我们会用就可以,关于更深的理解就要涉及到源码。