Spring注解——同⼀接⼝有多个实现类,如何注
⼊?@Resource、@Autowire。。。
这个问题是⼀个原来的同事去⾯试的时候被问起来了,然后引发了我的思考,觉得还是有必要梳理⼀下这种知识点的!
先写⼀个场景,举例说明:
1、接⼝:IAnimal
2、实现类:DogImpl ,实现了IAnimal接⼝。
3、业务类:AnimalController
假如有⼀个“动物”的接⼝ IAnimal, DogImpl类实现了接⼝ IAnimal, 且该接⼝只有 DogImpl这⼀个实现类,那么在引⽤实现类的时候,我们使⽤的是实现类的接⼝(像上⾯程序展⽰的那样)。Spring会按 byType的⽅式寻接⼝的实现类,将其注⼊。
假如有另⼀个实现类 CatImpl 也实现了接⼝ IAnimal, 这时候再按上⾯的⽅式去引⽤, 在同时存在两个实现类的情况下,会出现什么情况呢?
答:会报错。 这是由于 @Autowired 的特性决定的: @Autowired 的注⼊⽅式是 byType 注⼊, 当要注⼊的类型在容器中存在多个时,Spring是不知道要引⼊哪个实现类的,所以会报错。
那么在同⼀类型拥有多个实现类的时候,如何注⼊呢?
答:这种场景下,只能通过 byName 注⼊的⽅式。可以使⽤ @Resource 或 @Qualifier 注解。
@Resource 默认是按照 byName 的⽅式注⼊的, 如果通过 byName 的⽅式匹配不到,再按 byType 的⽅式去匹配。所以上⾯的引⽤可以替换为:
@Qualifier 注解也是 byName的⽅式,但是与@Resource 有区别,@Qualifier 使⽤的是 类名。
resource和autowired注解的区别总结:
1、@Autowired 是通过 byType 的⽅式去注⼊的, 使⽤该注解,要求接⼝只能有⼀个实现类。
2、@Resource 可以通过 byName 和 byType的⽅式注⼊, 默认先按 byName的⽅式进⾏匹配,如果匹配不到,再按 byType的⽅式进⾏匹配。
3、@Qualifier 注解可以按名称注⼊, 但是注意是 类名。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。