为什么Controller层注入的是Service接口,而不是ServiceImpl实现类
转自csdn--https://blog.csdn.net/weixin_39565597/article/details/78078728
今天看代码发现,写法和自己理解的java写法不一致,就查找资料,感觉这篇文章跟自己的理解一致,转发过来,以后查看方便。以下是原文转载,后面的评论有的也转过来了,实现类个人一般是用impl,作者用的impt。
今天在用maven+ssm时,发现一直提示报错:
Error creating bean with name ‘自己定义的实现类’: Injection of autowired dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Could not autowire field
经过仔细排查,发现在注入service的时候写成
Service层
接口
interface PCI{}
接口实现类
@Service
class PCIImpt imeplements PCI{}
Controller层
@Autowired
private PCIImpt pciImpt; //注入了实现类
1
2
3
4
5
6
7
8
9
10
在没有使用maven管理的时候注入实现类编译一直未报错,也就是说编译可以通过,但是使用maven管理后,编译报错。
而正确的写法:
Controller层
@Autowired
private PCI pci; //注入接口以Autowired自动接收
结果:编译通过;
1
2
3
4
结论就是:注入的是实现类对象,接收的接口;理解为多态;(Controller–Service–ServiceImpt–Mapper)
要遵循Controller–Service接口–ServiceImpt实现类–Mapper接口模式
那么在Service接口有多个ServiceImpt实现类的情况,就需要指定参数名来选择哪个ServiceImpt实现类了。
Service层(此时有两个接口实现类)
@Service("PCIImpt1")
class PCIImpt1 imeplements PCI{}
@Service("PCIimpt2")
class PCIImpt2 imeplements PCI{}
Controller层
@Resource(name="PCIimpt2") //填PCIimpt1,注入PCIimpt1实现类,填PCIimpt2,则注入PCIimpt2实现类
private PCI pci; //注入接口以Resource手动指定接收
1
2
3
4
5
6
7
8
9
10
同理:在ServiceImpt实现类中也是通过Mapper接口来接收;即:
ServiceImpt实现类
@Autowired
private Mapper mapper;
1
2
3
————————————————
版权声明:本文为CSDN博主「猪爷爷先生」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39565597/article/details/78078728
评论:
①由于在Service层使用了@Service注解,致使Spring在启动时会自动扫描并把PCIImpt实现类添加到Bean容器中(在容器中该Bean的实例名称为pCIImpt,第一个字母小写);②在Controller层里使用@Autowired注解,默认是使用byType在Bean容器瓶中查找出最适合的类的实例名赋值给pci(注意是按类来查找最适合的),在Bean容器瓶中最适合pci的Bean实例名称自然就是pCIImpt(因为它是PCI的接口实现类)。另外,接口的那个地方,也没放注解,它也没有实例化到Bean容器中,对于pci最适合的就只有pCIImpt
Mapper是跟Mybatis挂钩的interface,ServiceImpl使用这个interface进行CURD的操作。Controller使用的Service的Interface,实际上到现在SpringBoot框架,启动项含有自动扫描以后,不太需要Service上再加一个接口。如果是为了所谓的面向接口,其实也大可不必。因为实际使用场景中,我们的Service接口,基本不存在一个接口多个实现类这种场景。
为什么Controller层注入的是Service接口,而不是ServiceImpl实现类的更多相关文章
- 分层 DAO层,Service层,Controller层、View层
前部分摘录自:http://blog.csdn.net/zdwzzu2006/article/details/6053006 DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务 ...
- DAO层,Service层,Controller层、View层 的分工合作
DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...
- [转]DAO层,Service层,Controller层、View层
来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...
- Myeclipse插件快速生成ssh项目并配置注解 在action层注入service的超详细过程
最近发现,我对于ssh的 自动注入配置 还是不熟悉,于是整理了一下 终于做了一个 简单的 注入配置出来. 以前都是在applicationContext.xml 里面这样配 <bean id=& ...
- DAO(Repository),Service,Controller层之间的相互关系
DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...
- SpringMVC在Controller层中注入request的坑
记一次为了节省代码没有在方法体中声明HttpServletRequest,而用autowire直接注入所钻的坑 结论 给心急的人. 直接在Controller的成员变量上使用@Autowire声明Ht ...
- DAO层,Service层,Controller层、View层
DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...
- DAO层,Service层,Controller层、View层介绍
来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...
- 深入理解--SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层都有什么作用
SSM是sping+springMVC+mybatis集成的框架. MVC即model view controller. model层=entity层.存放我们的实体类,与数据库中的属性值基本保持一致 ...
- DAO层,Service层,Controller层、View层协同工作机制
转自 http://www.blogdaren.com/post-2024.html DAO层:DAO层主要是做数据持久层的工 作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计D ...
随机推荐
- Vue 实现点击空白处隐藏某节点
手动监听判断 <template> <div> <span ref="projectButton"> <el-popover v-mode ...
- Vue项目使用/deep/报错:SassError: expected selector解决方案--亲测有效
项目npm run dev报错如下: 解决方法: 尝试用 ::v-deep 替换 /deep/ ,成功解决了问题. 效果如下图所示(完美解决~) 某些预处理器(例如Sass)可能无法>>& ...
- allure安装配置
代理节点配置allure 下载allure https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline 配置环境变 ...
- Mac 如何用python下载Mac OS
Python脚本下载 开源地址:macadmin-scripts 打开终端 : git clone https://github.com/munki/macadmin-scripts 下载inst ...
- 081_Introducing trigger handler class
案例分析: 我们对一个Object写多个独立得Trigger. 但最终这不是最好的做法. 在Salesforce中,只为每个SObject设置一个触发器总是好的. 原因:每个独立触发器的执行顺序始终未 ...
- Burp学院-OS命令注入
1.OS command injection, simple case. 最简单的命令执行,[|] 两个只要有一个为True就执行 2.Blind OS command injection with ...
- 手写Web图片懒加载~
废话不多说,直接上代码: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <title>图片懒加载</title> ...
- Flink1.11 解决 No ExecutorFactory found to execute the application
在使用Flink1.11的时候写了个本地Test 运行的时候发现报错了,具体如下 Exception in thread "main" java.lang.IllegalState ...
- win10 + emacs + sml
1.官网下载sml编译器是smi安装包,安装结束之后把bin文件夹放到环境变量Path中 2.下载emacs压缩包,直接解压 3.emacs中alt+x,输入package-list 然后选择sml- ...
- CSDN上书签迁移
title: CSDN上书签迁移 date: 2020-11-01 16:34:30 img: /photos/2020.6.03_15/2020_06_11_cover.jpg summary: C ...