ioc存在的意義:“高內聚,低耦合”。
ioc可以使類與類之間-高內聚: 類內部的關係越緊密越好;低耦合: 類與類的關聯越少越好。用自己的話說就是類與類之間需要調用的時候,我們再也不是直接去調用了,而是通過ioc容器,運行的時候動態的生成對象、執行對象的方法、改變對象的屬性,spring就是通過反射來實現注入的。
採用了依賴注入,在初始化的過程中就不可避免的會寫大量的new。這裏IoC容器就解決了這個問題。這個容器可以自動對你的代碼進行初始化,你只需要維護一個Configuration(可以是xml可以是一段代碼),而不用每次初始化一輛車都要親手去寫那一大段初始化的代碼。這是引入IoC Container的第一個好處
給ioc的定義:
創建對象
Ioc—Inversion of Control,即“控制反轉”,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味着將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。
給對象屬性賦值
DI(Dependency Injection,依賴注入),Ioc的一個重點是在系統運行中,動態的向某個對象提供它所需要的其他對象。這一點是通過DI(Dependency Injection依賴注入)來實現的。
主要通過:下面三個方法實現
FileSystemXmlApplicationContext與ClassPathXMLApplicationContext的實現:
annotationXmlApplicationContext的實現方法:
創建對象的四個註解:
@Component 創建對象加入容器。如:工具類,除了dao、service、controller其他以外的類使用此註解。
@Repository 同@Component ,用於修飾持久層的類。
@Service 同@Component ,用於修飾業務層的類。
@Controller 同@Component ,用於修飾表現層的類。
依賴注入的四個註解:
@Autowired 給對象屬性賦值: 1. 根據類型注入(字段類型,方法形參類型); 2. 根據名稱注入(字段名稱,方法形參名稱)
@Qualifier 要配置@Autowired使用,可以只根據名稱注入。 也可以在純註解中單獨使用。
@Resource 瞭解,jdk1.8以後不提供此註解的支持。
@Value 直接給簡單類型屬性賦值,或獲取配置文件值。
對象範圍、生命週期相關的註解:
@Scope 指定對象爲singleton單例,或prototype多例。
@Lazy 延遲初始化(使用較少,因爲我們大多數單例的對象都是在啓動時候創建。)
@PostConstruct 修飾方法,修飾的方法會在創建對象之後執行。
@PreDestroy 修飾方法,修飾的方法會在調用容器的close()方法時候執行。
純註解開發用到的一些註解:
@Configuration 指定註解配置類
@ComponentScan 指定註解掃描的包
@Import 導入其他註解配置類
@PropertySource 加載類路徑下的配置文件
@Value、@Qualifier
@Bean 修飾方法,會自動把方法返回值加入ioc容器