Spring @Qualifier 註解,一個service 介面,有多個實現時,如何在controller 只引入service 介面,進而實現引入具體bean
阿新 • • 發佈:2018-12-11
參考: https://blog.csdn.net/mazuyu408/article/details/79629846
@Qualifier 作用
在只引入service 介面的情況下在,指示spring 引入value 為那個別名的具體service 實現類
場景:
假設有一個場景,一個service 介面定義了多個 實現類,而在controller 我只想引入 service 介面,而這時,因為有個實現spring 不知道具體引入那個就會報錯
介面;
public interface EmployeeService { public EmployeeDto getEmployeeById(Long id); }
實現1:起別名,標記為service
@Service("service")
public class EmployeeServiceImpl implements EmployeeService {
public EmployeeDto getEmployeeById(Long id) {
return new EmployeeDto();
}
}
實現2:起別名,標記為service1
@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) { #略 } }
產生的問題:
這樣引入時的報錯資訊:提示 建立Bean EmployeeInfoControl失敗,由於@autowired employeeService失敗,
沒有型別[com.test.service]的唯一bean。定義:期望的單個匹配bean,但發現2:[service1, service2]
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]
解決辦法:
前面我們不是分別給兩個service實現類起了別名嗎,這裡實際要匯入那個型別,(假設要匯入的是,EmployeeServiceImpl 別名是service,可以將controller 修改如下
@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) {
#略
}
}
或者使用@Resource 註解
@Controller
@RequestMapping("/emplayee.do")
public class EmployeeInfoControl {
@Resource(name="service")
EmployeeService employeeService;
@RequestMapping(params = "method=showEmplayeeInfo")
public void showEmplayeeInfo(HttpServletRequest request, HttpServletResponse response, EmployeeDto dto) {
#略
}
}