基于Spring的注解@Qualifier小結
Spring的注解@Qualifier小結
近期在捯飭spring的注解,現(xiàn)將遇到的問題記錄下來,以供遇到同樣問題的童鞋解決~
先說明下場景,代碼如下
有如下接口:
public interface EmployeeService {
public EmployeeDto getEmployeeById(Long id);
}
同時有下述兩個實現(xiàn)類 EmployeeServiceImpl和EmployeeServiceImpl1:
@Service("service")
public class EmployeeServiceImpl implements EmployeeService {
public EmployeeDto getEmployeeById(Long id) {
return new EmployeeDto();
}
}
@Service("service1")
public class EmployeeServiceImpl1 implements EmployeeService {
public EmployeeDto getEmployeeById(Long id) {
return new EmployeeDto();
}
}
調用代碼如下:
@Controller
@RequestMapping("/emplayee.do")
public class EmployeeInfoControl {
@Autowired
EmployeeService employeeService;
@RequestMapping(params = "method=showEmplayeeInfo")
public void showEmplayeeInfo(HttpServletRequest request, HttpServletResponse response, EmployeeDto dto) {
#略
}
}
在啟動tomcat時報如下錯誤:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'employeeInfoControl': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: com.test.service.EmployeeService com.test.controller.EmployeeInfoControl.employeeService; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.test.service.EmployeeService] is defined: expected single matching bean but found 2: [service1, service2]
其實報錯信息已經說得很明確了,在autoware時,由于有兩個類實現(xiàn)了EmployeeService接口,所以Spring不知道應該綁定哪個實現(xiàn)類,所以拋出了如上錯誤。
這個時候就要用到@Qualifier注解了,qualifier的意思是合格者,通過這個標示,表明了哪個實現(xiàn)類才是我們所需要的,我們修改調用代碼,添加@Qualifier注解,需要注意的是@Qualifier的參數名稱必須為我們之前定義@Service注解的名稱之一!
@Controller
@RequestMapping("/emplayee.do")
public class EmployeeInfoControl {
@Autowired
@Qualifier("service")
EmployeeService employeeService;
@RequestMapping(params = "method=showEmplayeeInfo")
public void showEmplayeeInfo(HttpServletRequest request, HttpServletResponse response, EmployeeDto dto) {
#略
}
}
問題解決!
@qualifier注解
@Qualifier限定哪個bean應該被自動注入。當Spring無法判斷出哪個bean應該被注入時,@Qualifier注解有助于消除歧義bean的自動注入。
參見下面的例子
public class Staff{
@Autowired
private user user;
}
我們有兩個bean定義為Person類的實例。
<beanid="staff"class="com.test.Staff"/> <beanid="user1"class="com.test.User"> <property name="name"value="zhangsan"/></bean> <beanid="user2"class="com.test.User"> <property name="name"value="lisi"/></bean>
Spring 知道哪個bean應該自動注入?不。當您運行上面的例子時,拋出如下異常:
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.test.User] is defined: expected single matching bean but found2: [user1, user2]
要解決以上問題,你需要使用@Quanlifier注解告訴Spring 哪個bean應該被autowired的。
public class Staff
{
@Autowired
@Qualifier("user1")
private User user;
}
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解Springboot Oauth2 Server搭建Oauth2認證服務
這篇文章主要介紹了Springboot Oauth2 Server 搭建Oauth2認證服務,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-05-05
詳解Elasticsearch如何把一個索引變?yōu)橹蛔x
這篇文章主要為大家介紹了詳解Elasticsearch如何把一個索引變?yōu)橹蛔x示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
SpringCloud中Sentinel基礎場景和異常處理方式
這篇文章主要介紹了SpringCloud中Sentinel基礎場景和異常處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-04-04

