spring的@primary和@qualifier注解解決一個接口多個實現的注入問題


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在不知道該選哪一個具體實現的時候選哪一個。

這個注解可以用在模塊拆分的場景。比如說有一個模塊A,有一個模塊B,模塊A和模塊B之間通過接口模塊進行交互。通過在接口模塊中定義接口,模塊B實現這個接口,模塊A調用這個接口(注入)。這時候,如果把B模塊要拆掉不要,那么A模塊中注入的時候就找不到具體的實現,就會報檢查異常。這時候,可以在接口模塊中添加默認實現類,然后在B模塊的真正實現類上添加@Primary注解,那么當有B模塊的時候就會調用B模塊中的實現,沒有的話就調用接口模塊中的默認實現,也就實現了模塊之間的解耦。

@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注解可以調用到具體實現,相當於一種標識機制。

 

"一個人的成長,是從發現自己並沒有自己想象的那么重要開始的。"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM