转自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实现类的更多相关文章

  1. 分层 DAO层,Service层,Controller层、View层

    前部分摘录自:http://blog.csdn.net/zdwzzu2006/article/details/6053006 DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务 ...

  2. DAO层,Service层,Controller层、View层 的分工合作

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  3. [转]DAO层,Service层,Controller层、View层

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  4. Myeclipse插件快速生成ssh项目并配置注解 在action层注入service的超详细过程

    最近发现,我对于ssh的 自动注入配置 还是不熟悉,于是整理了一下 终于做了一个 简单的 注入配置出来. 以前都是在applicationContext.xml 里面这样配 <bean id=& ...

  5. DAO(Repository),Service,Controller层之间的相互关系

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  6. SpringMVC在Controller层中注入request的坑

    记一次为了节省代码没有在方法体中声明HttpServletRequest,而用autowire直接注入所钻的坑 结论 给心急的人. 直接在Controller的成员变量上使用@Autowire声明Ht ...

  7. DAO层,Service层,Controller层、View层

    DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口 ...

  8. DAO层,Service层,Controller层、View层介绍

    来自:http://jonsion.javaeye.com/blog/592335 DAO层 DAO 层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DA ...

  9. 深入理解--SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层都有什么作用

    SSM是sping+springMVC+mybatis集成的框架. MVC即model view controller. model层=entity层.存放我们的实体类,与数据库中的属性值基本保持一致 ...

  10. DAO层,Service层,Controller层、View层协同工作机制

    转自 http://www.blogdaren.com/post-2024.html DAO层:DAO层主要是做数据持久层的工 作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计D ...

随机推荐

  1. 05 RDD练习:词频统计,学习课程分数

    .词频统计: 1.读文本文件生成RDD lines 2.将一行一行的文本分割成单词 words flatmap() 3.全部转换为小写 lower() 4.去掉长度小于3的单词 filter() 5. ...

  2. 05-python的输入与输出

    python输入(input)与输出(print) 一.输入(input) 在python3中,input会将接收到的用户输入自动存储为字符串类型 username = input('输入用户名:') ...

  3. Aspose.Cells 拒绝访问、数据库 64 bit mode with the 32 bit Oracle、视图加载格式不正确。

    第一次遇到发布程序后,引发的这么多奇葩问题.记录一下. 配置:windows server 2018 R2 企业版 sp1 这是一台闲置4年机子,拿到机子里面已经安装过oracle客户端,我直接卸载装 ...

  4. hive知识点总结

    hive知识点总结 1.什么是HIVE? 1.hive是hadoop生态圈的一个工具,提供一种结构化查询语言,可以查询HDFS或者其他文件系统上的文件. 2.hive操作: 1.hive一次使用命令: ...

  5. 简单的关键词查找实验(基于C语言)

    准备 书名数据库的阵列表示 关键字 书籍 B1 B2 B3 B4 B5 B6 B7 algebra 1 1 1 1 1 1 0 application 1 0 1 1 1 1 0 elementary ...

  6. [746] Interlude Update 3

    [746] Interlude Update 3 Client 00 SendProtocolVersion 01 MoveBackwardToLocation 02 Say 03 RequestEn ...

  7. cnpm 安装不上

    以管理员身份运行power shell,输入以下命令: set-ExecutionPolicy RemoteSigned 出现选项之后,输入A,回车,在输入 get-ExecutionPolicy 出 ...

  8. 手机、ESP32单片机、MQTT服务器连接实验

    实验目的:通过自己制作的手机APP,连接MQTT服务器,获取ESP32单片机的温湿度信息,控制ESP32单片机上的LED开关. 实验准备: 1.硬件:ESP32开发板(型号不限,esp01s也可以). ...

  9. cgroup与docker

    1.使用 cgroup namespace 需要内核开启 CONFIG_CGROUPS 选项.可通过以下方式验证: 1 root@container:~/namespace_test# grep CO ...

  10. selenium grid4.0+分布式的部署配置(hub/node方式)

    一.grid安装 本文已jar包的方式讲解,访问并下载jar包:Releases · SeleniumHQ/selenium · GitHub 二.grid配置 假设主机:10.1.5.219,从机: ...