摘要:今天在搭建项目的时候,遇到了一个奇怪的问题。中需要注入,中需要注入的接口,属性都是通过标签名的方式注入的。给你报错,就算不影响项目运行,那也确实有些不合适的地方。但是如果项目无法运行,仅关掉报警根本没卵用。
今天在搭建SpringBoot+SpringMVC+mybaits项目的时候,遇到了一个奇怪的问题。
Controller中需要注入Service,Service中需要注入Mybatis的Dao接口,属性都是通过“@+标签名”的方式注入的。比如一个简单的查询用户的controller,需要注入一个与用户有关的service:
@RequestMapping("/user") @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/list/all") public ListlistAll(){ return userService.listAll(); } }
service中又要注入Dao的接口:
@Service public class UserServiceImpl implements UserService { @Autowired private UserMapper userMapper; public ListlistAll(){ return userMapper.selectAll(); } }
但是在Service层竟然出现了如此问题:
不过问题不大,项目能够正常运行,并且使用@Resource标签代替@Autowired就可以完全解决问题:
但是为什么@Autowired在IDEA里面会有问题呢,经过网上寻找+个人思考,有以下两点结论:
1- 根据使用报错信息在网上搜索出的解决方案的总结
首先是IDEA这个工具强大的检测报警机制,如果IDEA说你的代码没问题,那么它肯定能编译通过。给你报错,就算不影响项目运行,那也确实有些不合适的地方。看到网上有些答案很可笑,让你去settings里面把这个报警关掉,这不是掩耳盗铃吗?当然了,如果不影响项目的正常运行,关掉报警也是一种方法,毕竟程序员看不见warning。但是如果项目无法运行,仅关掉报警根本没卵用。
2- @Autowired与@Resource的区别
@Autowired根据type注入,@Resource根据name注入,本质上均实现了注入效果,只是依据不同,那么为什么我在Controller中使用@Autowired就没问题呢,我认为原因在于两个地方注入Bean的类型不一样。以下是个人思考,如有不对请指教。
一般来说,注入controller的service虽然一般来说我们都是注入一个接口,但是该接口有实现类,并且使用@Service进行关联,所以注入类型应该也可以视为一个类,但是mybatis仅需提供Dao接口,也就是说,注入service的dao只是一个接口,而没有实现类,虽然mybatis能够通过Dao接口和xml文件实现与数据库的操作,但是@Autowired并没有这个识别功能,可能它就认为你类型不匹配,无法使用通过类型注入的方法。这个理论我通过一个简单的方法验证通过,做法如下:
我把service的实现类给取消了实现接口的语句‘implements UserService’,然后变成下面这样:
@Service public class UserServiceImpl{ @Resource private UserMapper userMapper; public ListlistAll(){ return userMapper.selectAll(); } }
此时,IDEA给controller中的注入也报出同样的警告:
所以我有充足的理由断定,应该是这个原因,也就是说,@Autowired不适用service层对于dao的注入。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75378.html
摘要:新入手了一个,打算重新配置下自己的开发环境,老的毕竟硬盘太小了,所以这次换了个的,好了闲话不说了,主要记录下我在安装系列产品中遇到的问题和解决办法。安装的产品,下载,安装,很顺利,没毛病。 新入手了一个Macbook pro,打算重新配置下自己的开发环境,老的mac毕竟硬盘太小了,所以这次换了个1T的,好了闲话不说了,主要记录下我在安装idea系列产品中遇到的问题和解决办法。 ...
摘要:新入手了一个,打算重新配置下自己的开发环境,老的毕竟硬盘太小了,所以这次换了个的,好了闲话不说了,主要记录下我在安装系列产品中遇到的问题和解决办法。安装的产品,下载,安装,很顺利,没毛病。 新入手了一个Macbook pro,打算重新配置下自己的开发环境,老的mac毕竟硬盘太小了,所以这次换了个1T的,好了闲话不说了,主要记录下我在安装idea系列产品中遇到的问题和解决办法。 ...
摘要:文章目录前言从上下源码后运行报错不支援验证类型。解决办法就是去找到下载,注意选择源码版本下载,如下图。入门教程本地环境搭建和源码编译安装,献给编译失败的同学,教程不断优化附录 ...
摘要:能够帮助大家少踩坑就好。找到上述代码中最相似的地方,添加错误解决方法路径错误,即当前访问的路径下没有相关文件。解决办法在文件存储服务器中的项目名的路径下,新建一个和你上传服务器路径一致的文件,我这里是文件。 能够帮助大家少踩坑就好。 1.springMVC跨服务器上传文件报错问题 当我们使用jersy把图片上传到我们的图片服务器中【tomcat】,我们可能会遇见以下三个错误: retu...
阅读 2784·2021-09-01 10:30
阅读 1679·2019-08-30 15:52
阅读 964·2019-08-29 18:40
阅读 1116·2019-08-28 18:30
阅读 2391·2019-08-23 17:19
阅读 1321·2019-08-23 16:25
阅读 2700·2019-08-23 16:18
阅读 2977·2019-08-23 13:53