springboot中service层注入的是实现类,但Controller层接收的是接口
我们习惯这样编写代码:
在service层写接口,然后用实现类去实现接口,并且将实现类注入到容器中
@Service
public class AccountServiceImpl implements AccountService {}
在controller层却是用接口操作service的bean的方法,
@Autowired
private AccountService userService;
为神魔这样?
理解:
1)注入的就是实现类,只不过拿接口来接收,接受的类型为接口,面向接口编程,那么为何要面向接口编程?这就涉及到使用接口做代理,因为通过@autowired的对象是通过接口的方式会使用jdk动态代理,jdk动态代理只能对实现接口的类生成代理,而不能针对类。
2)注入的是实现类对象,接收的是接口;理解为多态;
如果一个service接口有多个实现类呢?
controller类中使用@resource并通过byname的方式注入,不要用@autowired这种通过类型的方式了,
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手动指定接收
@Service注解是放实现类上的而非接口上
今天用springboot写多模块项目,写完第一个Controller类,注入的Service接口是ok的,然后写第二个Controller类就一直报错。这把我给搞懵逼了,为什么我第一个Controller没错,第二个错了,我代码都一样的啊。
我看他说没扫描到,就去看了下@Service注解,有啊。然后我再去看包名,也对的啊。多模块下面每个模块的包名都一样的,能够被@SpringBootApplication扫描到啊,彻底蒙圈了。
看来看去我都没找到哪里错了,好吧,1个半小时过去了,我自己找不到,去百度去问人。这是越来越蒙圈(百度要不是说包名要一样,要不就是说@SpirngBootApplication扫描同级及下层所有子包,我都知道啊,概念清楚,也没错,包名我又再对了一遍。然后再就是手动扫描,自己额外写注解,无论是@ComponentScan和@SpirngBootApplication(“xx”)我都试了,中间倒是掌握了个小知识——手动用注解扫描的话,记得还要手动把@SpringBootApplication注解所在的类的所在包一起扫进去)。
3个小时了,我彻底放弃了。准备重来一次,重新上git拉了个模板,把自己的代码文件一个一个拉过去,(以前出现过一次两个项目代码完全一样的,就是一个对了,一个出问题,现在怀疑是当时导入的maven依赖有冲突,一个运气好莫名其妙对了,一个运气差)拉着拉着我就 发现刚才好像有个文件没有@Service啊,额。再一看,好吧,还真没有,把@Service写到接口上去了,Impl实现类上没有@Service,额。无语,只能恨自己眼瞎,看包名看了一遍又一遍就是没看@Serivce到底放在什么位置。
总结一下:老老实实跟着IDEA的报错去找,这要是老老实实从service类开始开,细心一点,三个小时就不会浪费了。(也是自己技能没掌握扎实,我估计是当时犯浑,没搞清@Service放接口和放实现类上的差距)
过了1个多星期了,这几天复习了spring,spring可以管理部分工具类,但是不可以管理接口,也就是@Controller,@Component,@Repository,@Service不能放接口上。
springboot中service层注入的是实现类,但Controller层接收的是接口相关推荐
- SpringBoot中静态变量注入方案,一网打尽
前言 同事来找我,说自己想使用@Value注解来注入值,但是发现注入不进去,想让我帮忙看看.研究了一番,最后发现是@Value注解无法注入静态变量.下面我们一起来回顾一下本次的bug. 普通变量 首先 ...
- springboot中service中注入dao失败测试类中注入成功_聊一聊 Java 服务端中的乱象
查尔斯·狄更斯在<双城记>中写道:"这是一个最好的时代,也是一个最坏的时代." 移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动:随着行业竞争加剧,互联网红利 ...
- SpringBoot中Service层事务控制
SpringBoot中使用事务比较简单,在Application启动类上添加@EnableTransactionManagement注解,然后在service层的方法上添加@Transactional ...
- OA系统十八:请假申请四:【请假申请】这个内嵌界面中【提交请假表单数据】的Controller层;
本篇博客的主要内容是: 本篇博客需要注意的点: (1)一种策略,或称之为一种思想:一个Controller的url设置成通配符的形式,从而实现不同的请求调用不同方法: (2)加深感受下Session这 ...
- 在springboot中使用mybatis generate自动生成实体类和mapper
1.在全局的pom中引入mybatis generate的依赖 <!--自动生成实体--><dependency><groupId>org.mybatis.gene ...
- SpringBoot中service注入失败(A component required a bean of type ‘XXService‘ that could not found)...
先写了JUnit,发现启动不了,注释掉有问题的service也不可以.可能是因为spring开始时会加载所有service吧. 按照网友们的说法,一般需要检查: 1.入口类有没有写MapperScan ...
- SpringBoot中service注入失败 出现A component required a bean of type 'com.czxy.changgou3.mapper.OrderGoodsMa
错误信息 Error starting ApplicationContext. To display the conditions report re-run your application wit ...
- Springboot中手动new的对象无法注入交给Spring容器管理的原因及解决办法
Springboot中Bean的注入 我们都知道,Springboot可以使用方法级别注解(@Bean)和类级别注解(@Controller.@Component.@Service等)加包扫描的方式注 ...
- SSM框架中Dao层,Mapper层,controller层,service层,model层,entity层都有什么作用
SSM是sping+springMVC+mybatis集成的框架. MVC即model view controller. model层=entity层.存放我们的实体类,与数据库中的属性值基本保持一致 ...
最新文章
- 使用 IntraWeb (8) - 系统模板
- 机器学习经典必读书,李航《统计学习方法》出视频课了!
- Request_继承体系
- Hadoop之Join、计数器、数据清洗概述
- 【优化SQL Server循环更新、插入耗时长的问题】
- linux-shell面试题
- CCF NOI1031 等腰三角形
- elementui 做删除,分页页码不正确
- photoshop之小技巧
- 为什么说多用组合,少用继承?
- lua unpack php,Lua 可变参数 和 table.unpack() 函数
- blender建模常用建模快捷键
- IE浏览器版本测试方法
- 最新版HBuilderx + 夜神模拟器 模拟器调试设置
- 深入剖析Auto Layout,分析iOS各版本新增特性
- HTML常用标签 选择器
- 中国医科大学2021年12月《护理中的人际沟通学》作业考核试题
- 如何制作html电子杂志,使用iebook怎么制作电子杂志?iebook制作电子杂志图文教程...
- Vue中使用使用内联样式
- c语言中开yroot的函数,C语言中sqrt是什么意思
热门文章
- easyexcel 设置标题_使用easyexcel完成复杂表头及标题的导出功能(自定义样式)
- [转载] python类运算符的重载
- Java日历compareTo()方法与示例
- python调用菜单响应事件_Python处理菜单消息操作示例【基于win32ui模块】
- oracle 静态监听 端口,侦听动态注册静态注册local_listener参数端口PORT
- python 网格_Python | 网格到情节
- css复选框样式_使用CSS样式复选框
- mcq 队列_MCQ | 基础知识 免费和开源软件| 套装3
- 自由职业的前半年,我是如何度过的?
- InnoDB的内存结构和特性