0


java中同一个接口有两个或两个以上实现类时应当如何注入

java中同一个接口有两个或两个以上实现类时应当如何注入?
例如有一个接口,如下代码:

packagecom.xiangxue.util;publicinterfaceDemoService{voiddemo();}

此时有两个实现类实现了这个接口
实现类一: 代码如下

packagecom.xiangxue.util;@Service("demoServiceImpl")publicclassDemoServiceImplimplementsDemoService{@Overridepublicvoiddemo(){}}

实现类二: 代码如下

packagecom.xiangxue.util;@Service("demoServiceImpl2")publicclassDemoServiceImpl2implementsDemoService{@Overridepublicvoiddemo(){}}

如果此时按照常规@Autowired注入,系统会报错,注入不进去:代码如下

packagecom.xiangxue.util;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/demoController")publicclassDemoController{@AutowiredprivateDemoService demoService;@RequestMapping("demo")publicvoiddemo(){
        demoService.demo();}}

@Autowired是按 byType的方式进行注入的,当要注入的类型在容器中存在多个时,Spring是不知道要引入哪个实现类的,所以会报错。

这种场景下,只能通过 byName 方式注入。可以使用 @Resource 或 @Qualifier 注解。
@Resource 默认是按照 byName 的方式注入的, 如果通过 byName 的方式匹配不到,再按 byType 的方式去匹配。可以如下修改:

packagecom.xiangxue.util;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importjavax.annotation.Resource;/**
 * @projectName: ref-comet
 * @package: com.xiangxue.util
 * @className: DemoController
 * @author: sunyingtao
 * @description: TODO
 * @date: 2022/12/21 22:52
 * @version: 1.0
 */@Controller@RequestMapping("/demoController")publicclassDemoController{@Resource(name ="demoServiceImpl")privateDemoService demoService;@RequestMapping("demo")publicvoiddemo(){
        demoService.demo();}}

或者将@Qualifier与@Autowired组合使用,代码如下:

packagecom.xiangxue.util;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importjavax.annotation.Resource;/**
 * @projectName: ref-comet
 * @package: com.xiangxue.util
 * @className: DemoController
 * @author: sunyingtao
 * @description: TODO
 * @date: 2022/12/21 22:52
 * @version: 1.0
 */@Controller@RequestMapping("/demoController")publicclassDemoController{@Autowired@Qualifier("demoServiceImpl")privateDemoService demoService;@RequestMapping("demo")publicvoiddemo(){
        demoService.demo();}}

小结:
1、@Autowired 注解是通过 byType 类型的方式注入的,要求接口只能有一个实现类。
2、@Resource 注解可以通过 byName 和 byType的方式注入, 默认先按 byName的方式进行匹配,如果匹配不到,再按 byType的方式进行匹配。
3、@Qualifier 注解配合@Autowired 一起使用。

还有另外一种方式:
在某一个实现类上加上@Primary注解来解决(该类则不需要bean的name),该注解代表优先加载哪个bean;对于其他的实现则可以在类上定义bean的name

标签: java spring spring boot

本文转载自: https://blog.csdn.net/qq_40240091/article/details/128403195
版权归原作者 程序猿Sunny 所有, 如有侵权,请联系我们删除。

“java中同一个接口有两个或两个以上实现类时应当如何注入”的评论:

还没有评论