-
控制反轉: Inversion Of Control,簡稱IOC。物件的建立控制權由程式自身轉移到外部(容器),這種思想稱為控制反轉。
物件的建立權由程式設計師主動建立轉移到容器(由容器建立、管理物件)。這個容器稱為:IOC容器或Spring容器
-
依賴注入: Dependency Injection,簡稱DI。容器為應用程式提供執行時,所依賴的資源,稱之為依賴注入。
程式執行時需要某個資源,此時容器就為其提供這個資源。
例:EmpController程式執行時需要EmpService物件,Spring容器就為其提供並注入EmpService物件
IOC容器中建立、管理的物件,稱之為:bean物件
思路:
- 刪除Controller層、Service層中new物件的程式碼
- Service層及Dao層的實現類,交給IOC容器管理
- 為Controller及Service注入執行時依賴的物件
- Controller程式中注入依賴的Service層物件
- Service程式中注入依賴的Dao層物件
IOC詳解
bean的宣告
註解 | 說明 | 位置 |
---|---|---|
@Controller | @Component的衍生註解 | 標註在控制器類上 |
@Service | @Component的衍生註解 | 標註在業務類上 |
@Repository | @Component的衍生註解 | 標註在資料訪問類上(由於與mybatis整合,用的少) |
@Component | 宣告bean的基礎註解 | 不屬於以上三類時,用此註解 |
在IOC容器中,每一個Bean都有一個屬於自己的名字,可以透過註解的value屬性指定bean的名字。如果沒有指定,預設為類名首字母小寫。
元件掃描
- 使用四大註解宣告的bean,要想生效,還需要被元件掃描註解@ComponentScan掃描
@ComponentScan註解雖然沒有顯式配置,但是實際上已經包含在了引導類宣告註解 @SpringBootApplication 中,預設掃描的範圍是SpringBoot啟動類所在包及其子包。
手動新增@ComponentScan註解,指定要掃描的包
DI詳解
@Autowired註解,預設是按照型別進行自動裝配的(去IOC容器中找某個型別的物件,然後完成注入操作)
如果在IOC容器中,存在多個相同型別的bean物件,程式會報錯
如何解決上述問題呢?Spring提供了以下幾種解決方案:
-
@Primary
-
@Qualifier
-
@Resource
使用@Primary註解:當存在多個相同型別的Bean注入時,加上@Primary註解,來確定預設的實現。
使用@Qualifier註解:指定當前要注入的bean物件。 在@Qualifier的value屬性中,指定注入的bean的名稱。
- @Qualifier註解不能單獨使用,必須配合@Autowired使用
使用@Resource註解:是按照bean的名稱進行注入。透過name屬性指定要注入的bean的名稱。
面試題 : @Autowird 與 @Resource的區別
- @Autowired 是spring框架提供的註解,而@Resource是JDK提供的註解
- @Autowired 預設是按照型別注入,而@Resource是按照名稱注入