为什么接口没有注入spring容器,却可以@autowide和直接调用实现类的方法

这里先说一下 @Autowired/@Resource的注入原理:

        @Autowired是Spring的注解,Autowired默认先按 byType,如果发现找到多个 bean,则,又按照 byName方式比对,如果还有多个,则报出异常;

        @Resource 是JDK1.6支持的注解,默认按照名称( Byname)进行装配, 如果没有指定 name属性,当注解写在字段上时,默认取字段名,按照名称查找,如果注解写在 setter方法上默认取属性名进行装配。当找不到与名称匹配的 bean时才按照类型进行装配。但是需要注意的是,如果 name属性一旦指定,就只会按照名称进行装配。

        再来说Controller获取实例的过程:使用 @Autowired,程序在 spring的容器中查找类型是 TestService的 bean,刚好找到有且只有一个此类型的 bean,即 testServiceImpl,所以就把 testServiceImpl自动装配到了 controller的实例 testService中, testService其实就是 TestServiceImpl实现类;

        如果使用的是 @Resource,则是先在容器中查找名字为 testService的 bean,但并没有找到,因为容器中的 bean名字是 TestServiceImpl(如果 @Service没指定 bean的 value属性,则注入 bean的名字就是类名,如果指定了则是指定的名字),然后再通过类型查找 TestService类型的 bean,找到唯一的了个 TestService类型 bean(即 TestServiceImpl),所以就自动装配实例成功了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值