我有以下代碼:
public interface PolicyDetailsService {
public void display();
}
以下是實作
@Service("PolicyDetailsServiceImpl")
public class PolicyDetailsServiceImpl implements PolicyDetailsService {
@Override
public void display() {
System.out.println("PolicyDetailsServiceImpl displayed");
}
}
public class PreneedPolicyDetailsServiceImpl implements PolicyDetailsService {
@Override
public void display() {
System.out.println("PreneedPolicyDetailsServiceImpl displayed");
}
}
public class PreneedTrustPolicyDetailsServiceImpl implements PolicyDetailsService {
@Override
public void display() {
System.out.println("PreneedTrustPolicyDetailsServiceImpl displayed");
}
}
我通過創建如下的 bean 來創建物件,
@Bean(name = { "AGENCY-PLI", "AGENCY-PMM" })
public PolicyDetailsServiceImpl getPolicyDetailsServiceImpl(
@Autowired PolicyDetailsServiceImpl policyDetailsServiceImpl) {
return policyDetailsServiceImpl;
}
@Bean(name = { "AFS-AFS", "AFS-PMM" })
public PreneedPolicyDetailsServiceImpl getPreneedPolicyDetailsServiceImpl() {
return new PreneedPolicyDetailsServiceImpl();
}
@Bean({ "AFS-PMT" })
public PreneedTrustPolicyDetailsServiceImpl getPreneedTrustPolicyDetailsServiceImpl() {
return new PreneedTrustPolicyDetailsServiceImpl();
}
我使用服務的控制器,
@Autowired
Map<String, PolicyDetailsService> policyDetails;
@GetMapping("/display/{displayName}")
public String display(@PathVariable String displayName) {
try {
policyDetails.get(displayName).display();
}catch(Exception e) {
e.printStackTrace();
}
return "Display Succesfull";
}
我想要實作的目標:如果我在 REST 服務呼叫中傳遞“AGENCY-PLI”或“AGENCY-PMM”,則地圖應回傳 PolicyDetailsS??erviceImpl 物件。它目前正在為“AGENCY-PLI”作業。在傳遞“AGENCY-PMM”時,我收到 NullPointerException,因為地圖沒有回傳任何物件。我的理解是,“AGENCY-PLI”充當主要名稱,其他名稱是別名。所以如果我像下面這樣使用它,
@Autowired
@Qualifier("AGENCY-PMM")
private PolicyDetailsService policyDetailsService;
我會得到正確的物件參考。所以,我的問題是:有沒有辦法可以在傳遞別名時從地圖中獲取物件。
uj5u.com熱心網友回復:
其實我覺得不用拿地圖就可以解決。這是您可以嘗試的可能解決方案。
@Autowired
ApplicationContext applicationContext;
@GetMapping("/display/{displayName}")
public String display(@PathVariable String displayName) {
try {
PolicyDetailsService service = applicationContext.getBean(displayName, PolicyDetailsService.class);
service.display();
}catch(Exception e) {
e.printStackTrace();
}
return "Display Succesfull";
}
另外,我想知道你為什么創建一個PolicyDetailsServiceImplbean using@Service和另一個 using @Bean,這是一個錯字嗎?如果您想創建一個單身人士,我認為您最好洗掉@ServiceinPolicyDetailsServiceImpl并添加名稱@Bean(name=xxx)
編輯 1
對不起,我錯過了@Autowired注射@Bean。您的代碼將正確回傳。但是我想知道你為什么要這樣做。為什么不寫如下代碼?
public class PolicyDetailsServiceImpl implements PolicyDetailsService {
@Override
public void display() {
System.out.println("PolicyDetailsServiceImpl displayed");
}
}
@Bean(name = { "PolicyDetailsServiceImpl", "AGENCY-PLI", "AGENCY-PMM" })
public PolicyDetailsServiceImpl getPolicyDetailsServiceImpl() {
return new PolicyDetailsServiceImpl();
}
如果您想創建單例,通常沒有人會按照您指定的方式執行代碼。這個比較復雜,不容易理解。或者您能說明為什么要以這種方式創建代碼的任何原因嗎?
編輯 2
關于您的問題,為什么它不適用于 Map<String, PolicyDetailsS??ervice> 使用@Autowired.
至于Map<String, XXXXBean>Autowiring a ,Spring 將創建一個映射,其 beanId 為鍵, beanInstance 為值。
實際上 Spring 有name和alias的概念。當您指定時@Bean(name = { "AGENCY-PLI", "AGENCY-PMM" }),指定的第一個名稱將被設定為 bean 名稱,所有其余的將是別名。這就是為什么您只能獲得在 Map 鍵中找到的第一個 beanId。這也是不能指定@Component多個名稱的原因,因為它只支持設定bean名稱,不支持別名。
希望資訊有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/327891.html
上一篇:Vulnhub靶場滲透-DC-1
