为什么Controller层注入的是Service接口,而不是ServiceImpl实现类

为什么Controller层注入的是Service接口,而不是ServiceImpl实现类

老师,这里能详细讲一下吗?百度了一下也没看明白

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

2回答
好帮手慕小脸 2021-01-31 16:40:59

同学你好,如果只是单纯注入是可以用实现类接收注入对象的,但是往往开发中会对实现类做增强,如事务,日志等,实现增强的AOP技术是通过动态代理实现的,而spring默认是JDK动态代理,JDK动态代理是需要接口作为参数。 对实现类对象做增强得到的增强类与实现类是兄弟关系,两个是并列的,而不是泛化的关系

所以这里需要用接口接收。这里同学可以记住:

注入的是实现类对象,接收的接口;可以理解为多态;(Controller–Service–ServiceImpt–Mapper)

祝学习愉快~

好帮手慕小脸 2021-01-31 14:36:06

同学你好,这里其实注入的是接口的实现类。

同学可以回想在java零基础部分学习的多态作业中的 IAct actor  ; 然后把各个小动物分别赋值给actor 。给actor注入的是什么动物,则调用方法就会出现对应的方法。

这里虽然是用接口接收的,但注入的却是实现类。

http://img1.sycdn.imooc.com//climg/60164f7f0995f7be07040124.jpg

http://img1.sycdn.imooc.com//climg/60164f91096d8de805360150.jpg

这样符合代码的高内聚低耦合的原则。不用多次创建对象。如果需要其他的实现类,直接注入其他的实现类就可以了。

祝学习愉快!

  • 提问者 幕布斯2414477 #1

    老师从应用角度我是知道 注入时的memberService实际上指向的 @Service("memberService")

    但是 private MemberService 指向的接口,

    或者说这里为什么不使用 private MemberServiceImpl memberService  这个问题我还是没明白。这个具体和动态代理有什么关系?

    http://img1.sycdn.imooc.com//climg/601656ad098c903408400348.jpg


    2021-01-31 15:09:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师