Spring Boot 注入介面 @Autowired interface
1.若介面只有唯一一個實現類的注入方式
先建立一個介面VideoService
public interface VideoService {
String getVideoName();
}
建立一個介面的實現類VideoServiceImpl,使用@Service註解
@Service
public class VideoServiceImplA implements VideoService {
@Override
public String getVideoName() {
return "三生三世十里桃花";
}
}
在其他類中注入VideoService,此處以一個Controller類示例:
@RestController
public class HomeController {
@Autowired
private VideoService videoService;
@RequestMapping("/video")
public String videoName(){
return videoService.getVideoName();
}
}
訪問結果
具體注入詳情如下(需新增spring-boot-starter-actutor):
對應介面注入的Bean
2.介面有多個實現類的注入方式
新增一個VideoService的實現類VideoServiceImplB:
@Service
public class VideoServiceImplB implements VideoService{
@Override
public String getVideoName() {
return "人民的名義";
}
}
重啟專案結果如下:
多個實現類情況
Spring給了明確提示說有2個Bean被找到,但是隻需要一個。建議使用@Primary註解使其優先被選擇,或者使用@Qualifier指定注入一個Bean。
先看第一種@Primary註解,在VideoServiceImplB上新增@Primary註解:
@Service @Primary public class VideoServiceImplB implements VideoService{ @Override public String getVideoName() { return "人民的名義"; } }
@Primary註解VideoServiceImplB
HomeController中注入的也是videoServiceImplB:
被注入的videoService
總結:使用@Primary註解的實現類會被優先注入
再來看看@Qualifier註解,去掉VideoServiceImplB的@Primary註解,改寫HomeController的程式碼:
@RestController
public class HomeController {
@Autowired
@Qualifier("videoServiceImplB")
private VideoService videoService;
@RequestMapping("/video")
public String videoName(){
return videoService.getVideoName();
}
}
重啟專案,結果和上面一樣,說明注入的videoService是videoServiceImplB。
總結:使用@Qualifier注入指定Bean的時候,若沒有指明Bean的名稱,則其預設名稱是首字母小寫的類名。
那麼如何指定Bean的名稱呢?看看@Service的程式碼:
@Service
此處的value值即為bean的名稱,使用時將 @Service 改為 @Service("bean名稱") 即可。注入時使用 @Qualifier("bean名稱")
看看效果:
@Service("videoB")
public class VideoServiceImplB implements VideoService{
@Override
public String getVideoName() {
return "人民的名義";
}
}
@RestController
public class HomeController {
@Autowired
@Qualifier("videoB")
private VideoService videoService;
@RequestMapping("/video")
public String videoName(){
return videoService.getVideoName();
}
}
指定Bean名稱