1. 程式人生 > >Spring @Qualifier 註解,一個service 介面,有多個實現時,如何在controller 只引入service 介面,進而實現引入具體bean

Spring @Qualifier 註解,一個service 介面,有多個實現時,如何在controller 只引入service 介面,進而實現引入具體bean

參考: 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) {
        #略
    }
}