Spring Boot 注入介面 @Autowired interface
前言:@Service @Component @Configuration 注入方式相同
介面只有唯一一個實現類的注入方式
先建立一個介面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();
}
}
訪問 http://localhost/video 正常,結果如下:
具體注入詳情如下(需新增spring-boot-starter-actutor):
介面有多個實現類的注入方式
新增一個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 "人民的名義";
}
}
重啟專案->正常啟動。訪問 http://localhost/video 結果如下:
HomeController中注入的也是videoServiceImplB:
總結:使用@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的程式碼:
此處的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();
}
}
相關文章
- Spring @Autowired 注入小技巧Spring
- 【Spring Boot】yaml配置注入Spring BootYAML
- Spring @Autowired 註解自動注入流程是怎麼樣?Spring
- interface/介面
- Spring之autowiredSpring
- 解決Autowired注入失敗為nullNull
- Spring Boot無法對Service進行注入Spring Boot
- 聊聊依賴注入註解@Resource和@Autowired依賴注入
- @Autowired 注入 **required a single bean, but 2 were found**UIBean
- public interface View介面和public interface ViewResolver介面介紹View
- 如何理解 interface 介面
- Java-介面(interface)Java
- java之介面interfaceJava
- C#介面interfaceC#
- c# interface介面C#
- firewalld: 介面interface操作
- @Resource的作用相當於@Autowired,只不過@Autowired按照byType自動注入
- Spring使用Quartz定時排程Job無法Autowired注入Service的解決方案Springquartz
- Spring Boot 配置介面 WebMvcConfigurerSpring BootWebMVC
- @Resource,@Autowired,@Inject3種注入方式詳解
- spring下應用@Resource, @Autowired 和 @Inject註解進行依賴注入的差異Spring依賴注入
- Spring Autowired(required = false) 說明SpringUIFalse
- java中的interface(介面)Java
- c# interface介面之C#
- Spring Boot 應對 Log4j2 注入漏洞指南Spring Boot
- 瞭解下C# 介面(Interface)C#
- go sort.Interface 排序介面Go排序
- Interface(介面分享)第一節
- C#-介面(Interface)詳解C#
- Golang interface介面深入理解Golang
- Spring探索:既生Resource,何生Autowired?Spring
- Spring Boot 整合 Swagger 構建介面文件Spring BootSwagger
- Spring Boot 2.x(十一):AOP列印介面資訊Spring Boot
- interface 介面 -Go 學習記錄Go
- Java介面(interface)的概念及使用Java
- 6.6 多文件介面(Multiple Document Interface)
- 專案啟動報錯怎麼辦?看看你Spring自動注入用對了嘛?@Autowired XxxService注入問題解決Spring
- Spring Boot:Spring Boot配置MybatisSpring BootMyBatis