controller中为什么注入service接口,而不是service接口的实现类。

一、案例背景引入

外卖项目中,菜品分类删除,当要删除的分类,关联了菜品或者套餐。则删除失败

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控制类)内部的代码。你的代码会更加灵活,这是一种编程的最佳实践,符合依赖注入的设计原则。

根据注入的接口,找到接口的实现类,是框架实现的。我们会用就可以,关于更深的理解就要涉及到源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值