踩坑:IDEA中项目顺利运行但@Autowired报错的解决方法

转载地址:https://www.ucloud.cn/yun/75378.html
因为本人在学习SpringBatch项目时遇到了,@Autowired能运行项目但提示找不到这个类型的对象,在改成@Resource后又不爆红,疑惑之下愤然百度,觉得原作者说的很对,太对,相当对,故而转载

	@Autowired
    private JobLauncher jobLauncher;

    @Autowired
    private JobBuilderFactory jobBuilderFactory;

    @Autowired
    private StepBuilderFactory stepBuilderFactory;

踩坑:IDEA中项目顺利运行但@Autowired报错的解决方法
yanbingyun1990 发布于2019-08-16 18:35 / 2128人阅读
摘要:今天在搭建项目的时候,遇到了一个奇怪的问题。中需要注入,中需要注入的接口,属性都是通过标签名的方式注入的。给你报错,就算不影响项目运行,那也确实有些不合适的地方。但是如果项目无法运行,仅关掉报警根本没卵用。

今天在搭建SpringBoot+SpringMVC+mybaits项目的时候,遇到了一个奇怪的问题。

Controller中需要注入Service,Service中需要注入Mybatis的Dao接口,属性都是通过“@+标签名”的方式注入的。比如一个简单的查询用户的controller,需要注入一个与用户有关的service:

@RequestMapping("/user")
@RestController
public class UserController {
    @Autowired
    private UserService userService;
    @GetMapping("/list/all")
    public List listAll(){
        return userService.listAll();
    }
}

service中又要注入Dao的接口:

@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    public List listAll(){
        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 List listAll(){
        return userMapper.selectAll();
    }
}

此时,IDEA给controller中的注入也报出同样的警告:

所以我有充足的理由断定,应该是这个原因,也就是说,@Autowired不适用service层对于dao的注入。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值