Autowired用法案例
使用前提
- 在spring容器中
- 在包扫描路径下
使用场景
该注解主要用于创建对象(比较常用的就是CRUD操作)
测试结构
1 | src.main |
测试子类及结论
先证明@Autowired发挥作用
1 | // 父类 |
1 | // 子类1 |
1 | // 测试类 |
成功运行并打印猫吃鱼
结论1:此时Dog类还没有被定义,说明@Autowired是根据类型注入的
结论2:@Component必须放在实现类中,如果放到父类中,子类实现其方法无法进行继承(无论有无@Inherited注解)
1 | // 子类2 |
1 | // 测试类 |
此时输出狗吃肉
结论3:因为两个类都实现Base接口,spring无法根据其类型去确定哪一个实现类,会根据名称来确定,如果未指定,则根据变量名确定。此时定义dog,所以输出dog的方法。如果变量名既不是cat也不是dog,那么IDE会提示Could not autowire. There is more than one bean of 'Base' type.
也无法正常运行
证明结论2,@Component本身没有实现@Inherited,所以才不能作用于接口吗?
1 | // 自定义接口类并定义继承行为 |
1 | // 修改注解,验证自定义注解可用 |
此时输出狗吃肉
在将该注解去除,并在Base接口上添加,运行会提示Unsatisfied dependency expressed through field 'cat';
无法找到依赖对象,说明没有加入spring容器中,也就证明结论2
如果多个类实现了一个接口,应该如何指定?
使用@Qualifier("cat")
注解,或者使用@Resource(name = "cat")
进行名称指定。这两个注解作用是相同的,但一般使用@Autowired实现
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 柠檬大师的空间站!
评论