spring的@primary和@qualifier注解解决一个接口多个实现的注入问题

@Primary注解

Spring中有提供一个@Primary注解,具体的作用是在一个接口有多个实现类的情况下,会默认选择其中一种实现,帮助Spring对象的正常注入。

比如说现在有一个接口UserService,它有两个实现类UserServiceImpl1和UserServiceImpl2,根据依赖倒置的原则,在Spring中注入的对象应该是接口,由接口去调用具体的实现。

// 接口
public interface UserService {
    String getUserName();
}
// 实现1
@Service("userServiceImpl1")
public class UserServiceImpl1 implements UserService{
    public String getUserName() {
        return "张三";
    }
}
// 实现2
@Service("userServiceImpl2")
public class UserServiceImpl1 implements UserService {
    public String getUserName() {
        return "李四";
    }
}
// 调用者注入接口对象
@Service("loginServiceImpl")
public class LoginServiceImpl implements LoginService {
    @Autowired
    private userService; // 通过接口注入实现

    public void getLoginUser() {
        System.out.pringln("当前登录的用户是:" + userSerivce.getUserName());
    }
}

那么现在就有一个问题,因为Spring注入对象的时候默认是根据类型Type来自动注入的,在有两个实现的情况下,Spring无法根据类型选择到底注入哪一个,即接口不知道该调用哪个实现,就会产生检查异常,导致编译不通过。这时候就可以用@Primary来解决这个问题。

// 实现2
@Primary
@Service("userServiceImpl2")
public class UserServiceImpl1 implements UserService {
    public String getUserName() {
        return "李四";
    }
}

用@Primary注解来告诉Spring在不知道该选哪一个具体实现的时候选哪一个。

@Qualifier注解

Spring也提供一个@Qualifier注解来解决实现冲突的问题。

// 实现1
@Service("userServiceImpl1")
@Qualifier("userServiceImpl1")
public class UserServiceImpl1 implements UserService{
    public String getUserName() {
        return "张三";
    }
}
// 实现2
@Service("userServiceImpl2")
@Qualifier("userServiceImpl2")
public class UserServiceImpl1 implements UserService {
    public String getUserName() {
        return "李四";
    }
}
// 调用者注入接口对象
@Service("loginServiceImpl")
public class LoginServiceImpl implements LoginService {
    @Autowired
    @Qualifier("userServiceImpl2")
    private userService; // 通过接口注入实现

    public void getLoginUser() {
        System.out.pringln("当前登录的用户是:" + userSerivce.getUserName());
    }
}

通过在实现类和注入调用上使用@Qualifier注解可以调用到具体实现,相当于一种标识机制。

"其实你没有那么重要。"

原文地址:https://www.cnblogs.com/yanggb/p/10842827.html

时间: 2024-10-02 02:08:16

spring的@primary和@qualifier注解解决一个接口多个实现的注入问题的相关文章

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

最近有个需求就是一个抽象仓储层接口方法需要SqlServer以及Oracle两种实现方式,为了灵活我在依赖注入的时候把这两种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这时候就在想能不能实现动态的选择使用哪种实现呢?如果可以的话那么我只需要在配置文件中进行相应的配置即可获取到正确的实现方法的调用,这样的话岂不快哉!今天我们就来一起探讨下实现这种需求的几种实现方式吧. 作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu

springmvc结合@Qualifier注解调用同一接口的不同实现类

#在controller中定义接口并使用spring注解方式@autowired来进行装配工作 #对不同的service进行get和set,并在set方法中使用@qualifier标注对应的service名称, 注意,这里标注的service名称一定要跟spring对应xml中的bean的ID保持一致! #在对应controller中 #实现类2 #实现类1 #spring对应xml中配置对应javabean,bean对应ID的名称一定要和controller中的service名称保持一致!

spring in action 学习笔记八:用@Primary 或者@Qualifier消除@Autowired引起的歧义现象

首先解释一下@Primary和@Qualifier这两个注解的意思:@Primary的意思是在众多相同的bean中,优先使用用@Primary注解的bean.而@Qualifier这个注解则指定某个bean有没有资格进行注入. 示例代码的思路是:1.一个接口Dessert和这个接口的三个实现类,2.再在一个类(AbrahamLincoln)中自动注入Dessert这个接口,3.用自动扫描机制自动创建bean. 如果不用@Primary和@Qualifier注解,势必出现如下错误:NoUnique

spring学习(二)——注解

近期看github上Java项目接触到多种注解,这里对其使用场景做简单的整理 问题: 1. 为什么要用注解?不用注解是否可以实现? 2. 注解的组成? 注解类似一个接口 注解可以定义可指定的属性 3. 如何自定义注解? 4. java spring框架中有哪些已有的注解? 注解 使用场景 备注 @Configuration 类似于xml中<beans>标签   @Bean 类似于xml中<bean>标签 常与@Configuration配合使用  @ComponentScan 可指

net core天马行空系列: 一个接口多个实现类,利用mixin技术通过自定义服务名,实现精准属性注入

系列目录 1.net core天马行空系列:原生DI+AOP实现spring boot注解式编程 2.net core天马行空系列: 泛型仓储和声明式事物实现最优雅的crud操作 哈哈哈哈,大家好,我就是高产似母猪的三合.日常开发中,我们常会遇到这样的场景,一个接口,有多个实现类,在某个业务中,我们希望指定某个实现类,如今网络上常见的解决方案,就是注入一个委托或者利用工厂模式,这些方式虽然能实现功能,但使用起来还是不够优雅,如何才称得上优雅呢?自然是在添加服务的时候给服务指定名称,注入的时候根据

Spring注解解决属性中的自动注入

@Autowired  Spring 2.5 引入了 @Autowired 注释,它可以对类成员变量.方法及构造函数进行标注,完成自动装配的工作. 通过 @Autowired的使用来消除 set ,get方法. 加在成员变量之上可以省略get set方法. 但是首先得现在Spring配置文件中配置org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor @Resource 注解被用来激活一个

spring boot Controller中使用注解@RequestBody遇到的一个问题

spring boot Controller中使用注解@RequestBody遇到的一个问题总结: 通过@RequestBody接收实体对象,如代码所示 @PostMapping(value = "addtype")public Object addAppType(@RequestBody AppType appType) throws Exception{ return JsonData.buildSuccess();} 用postman测试接口时, 首先选择post请求 然后Hea

@Autowired注解与@Qualifier注解搭配使用----解决多实现选择注入问题

问题:当一个接口实现由两个实现类时,只使用@Autowired注解,会报错,如下图所示 实现类1 实现类2 controller中注入 然后启动服务报错,如下所示: Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean

Spring学习记录(十一)---使用注解和自动装配

Spring支持用注解配置Bean,更简便. 上面的组件,是根据实际情况配的.比如写的一个类,是做业务处理的,那就用注解@Service表示服务层组件,以此类推.将整体分成不同部分. 要在xml加入context命名空间 1 <!-- 指定Spring IOC容器扫描的包 --> 2 <context:component-scan base-package="package com.guigu.spring.beans.annotation"></cont