关于@Autowired注解的注入

关于@Autowired注解的注入

老师,@Autowired这个注解不是说默认按类型注入么,视频中的代码注入的时候是注入一个接口,为什么可以在下面直接调用接口的方法啊?不是应该声明个接口的实现类然后用@Autowired来注入才能调用里面实现的方法么?

http://img1.sycdn.imooc.com//climg/5d3b13710001223a15070850.jpg

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

1、如果多个实现类实现了同一个接口的话,这个时候用我问题中图片的接口声明方式来注入,注入的又是哪个实现类的实例对象呢?

答:

如果同一个接口有多个实现类的话,同学就不能单独的用@Autowired来注入了,可以在注解后边写上名字,用@Autowired配合 @Qualifier("orderDaoImpl")来注入了 或者用@Resource(name=“orderDaoImpl ”)

http://img1.sycdn.imooc.com//climg/5d3bf5aa0001ed1a05290103.jpg

2、注入的时候,这个属性不可以是OrderServiceImap 而是它的接口OrderService

3、关于同学说的第三条,同学这里可以当做一个知识点记忆,就是注入的时候,接收的要是接口类型,如果是是实现类的不可以的。会报错。这里的用法就之前学习的多态。同学这里不容易理解的话请先记住即可呦。

4、这里同学可以不必纠结,这里老师说的相对比较深一点,解释到了aop的增强,我们想要用增强的后的时候,必然要用增强后的对象呦,而不会使用原来的。不然我们为什么要增强呢?

5、如果用实现类接收的话应该是会报错的呦。这里涉及到的知识比较底层,同学记住就可以,用接口来接收哦。

6、如果有多个实现类,则用老师说的第一问中的方法注入,注入的是哪个实现类,则就调用的是哪个里边的实现方法。也体现了多态。

就像我们做的第一阶段的多态的作用,用接口 调用,给它注入的哪个实现类调用的就是哪个实现类的方法。

7、建议同学如果贴代码或者有多条的话,可以在我要回答中提问呦,回复中会失去格式

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!


  • 哆丶哆 提问者 #1
    懂了,感谢老师耐心讲解。另外,我在回复中是打好格式的,不知道保存之后会失去格式,下次会注意去回答中提问的,谢谢老师!!
    2019-07-27 15:31:05
芝芝兰兰 2019-07-27 12:18:46

同学你好。下面来一条条解答你的疑惑:

1、我们使用@Autowired实际注入的是实现类,Service标签注册的也是实现类。所以虽然用OrderService声明,也可以使用OrderServiceImpl的方法。

http://img1.sycdn.imooc.com//climg/5d3bd06600017cf107800113.jpg

2、如果只是单纯数据注入,声明为实现类也是可以接收注入对象的。但在开发中往往会对实现类增强,如事务、日志等,这些是通过AOP动态代理实现的。springAOP使用动态代理,对实现类对象做增强得到的增强类与实现类是兄弟关系,所以不能用实现类接收增强类对象,只能用接口接收。


如果解答了同学的疑问,望采纳~

祝学习愉快~


  • 提问者 哆丶哆 #1
    那这样的话,我想问: 1.如果多个实现类实现了同一个接口的话,这个时候用我问题中图片的接口声明方式来注入,注入的又是哪个实现类的实例对象呢? 2.如果说一个实现类实现了某个接口,但是它没有被增强(即没有用springAOP给他代理),那用实现类声明的方式注入也是可以的么?如: @Service public class OrderServiceImpl inplements OrderService{.....} 然后另一个类中注入对象 @Autowired private OrderServiceImpl rderServiceImpl; 3.老师的回答中说道“对实现类对象做增强得到的增强类与实现类是兄弟关系”,这是什么意思啊?是不是说,假设对一个实现了接口的一个实现类A进行AOP动态代理,会生成一个经过代理增强后的,继承和A同样接口的类B啊?如果是的话,这个B是存在于内存中看不到的么? 4.还是这句话“对实现类对象做增强得到的增强类与实现类是兄弟关系”,既然两个类是兄弟关系,那原有的类A和增强后的类B就是两个不同的类啦。要是这样的话,那我不是可以调用原来的类A的方法了?这样不是和没有增强一样? 5.对于最后所说的“不能用实现类接收增强类对象,只能用接口接收”,如果说我直接用实现类来接受输入对象,难道接受的就是没有被增强的实例对象么?换句话说,如果用接口声明方式注入,@Autowired注入的就是实现这个接口而且没增强后的类,是这样么? 6.最后就是,如果只能用接口接受的话,那如果多个类实现了同一个接口,里面实现方法不同,每个实现类被增强的内容也不一致,这时候通过声明接口方式,用@Autowired来注入的话,是什么效果呢?
    2019-07-27 14:22:55
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师