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

Posted yanggb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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注解可以调用到具体实现,相当于一种标识机制。

 

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

以上是关于spring的@primary和@qualifier注解解决一个接口多个实现的注入问题的主要内容,如果未能解决你的问题,请参考以下文章

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

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

Spring(SpringBoot)--同类型多个bean的注入--@Primary/@Qualifier

Spring注解驱动开发——自动装配 @Autowired @Qualifier @Primary

Spring注解驱动开发第20讲——使用@Autowired@Qualifier@Primary这三大注解自动装配组件,你会了吗?

Spring注解@Primary的意思