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注解可以調用到具體實現,相當於一種標識機制。
"一個人的成長,是從發現自己並沒有自己想象的那么重要開始的。"