一 、 什麼是IOC(Inversion of Control)java
IOC :控制反轉,也稱爲依賴注入(DI)。聽起來有點雲裏霧裏,他究竟是個啥,爲何Spirng中最基礎的就是它?spring
咱們的項目其實都是有一個一個的Bean組成的(通俗的說就是一個一個的java類),咱們若是要使用一個Bean,那麼就得在使用的地方new一個對應的實例出來,這樣一來個人這個Bean是否是就依賴了另一個Bean,並且對於某一個Bean,有可能其餘不少地方會用到?是否是?那麼,當個人這個Bean要換一種實現,那麼我是否是要將代碼中其全部的地方都得改一下,這種強耦合,顯然不是咱們所指望的。並且,一個Bean絕大多數時候作的事情都是同樣的,若是處處new,那咱們內存中的Bean就爆炸式的增加,顯然也不是咱們所指望的。tomcat
那麼,咱們有沒有一個東西,像tomcat容器同樣,將咱們的Bean放到裏面,並且每一個Bean不特殊聲明的話,就只有一份,我要用的時候(程序運行的時候,寫代碼的時候我只要聲明),讓容器把這個Bean給我就是了。這個就是Spring給咱們乾的事:做爲一個容器,將Bean裝起來,管理起來。(這裏面就用到了集合,這也是爲何在TinkingInJava這本書中,把咱們的集合稱做容器了,我以爲叫容器更合適)maven
這樣一來,咱們看看,平時都是咱們要用一個Bean的時候去再使用的地方主動new一個,這種對應用的控制是由引用者本身來決定的。如今,這種應用的控制由Bean容器擔當,使用者不要直接去new一個Bean,你只要告訴我你要什麼Bean,我容器已經給你new好了,你要用的時候我給你就是了(一般是建立這個調用者示例的時候將被調用的Bean給他,亦或叫將這個依賴注入給它)。至於具體用哪個,這就由容器統一管理了。這就是所謂的「控制反轉」--使用者只聲明不控制(不new一個具體的bean),由一個統一的控制中心(Bean容器)去控制。 spring-boot
這就是控制反轉,是否是很簡單。並且聽到這裏,咱們你們都會浮出「工廠方法」這個詞,對沒錯,Spring就是經過工廠方法實現的控制反轉。接下來,咱們來簡單介紹一下Spring中IOC的實現。工具
2、Spring-IOC簡單介紹學習
IOC 基礎包測試
|- org.springframework.beans : Spring中Bean操做的核心也是基礎包,其中BeanFactory接口是Spring中訪問Bean的跟接口,它提供了一種高級配置機制,可以管理任何類型的對象。this
|- org.springframework.context : Spring中上下文相關包,其中ApplicationContext接口繼承自BeanFactory接口。編碼
|- org.springframework.core : Spring和核心工具類,幾乎spirng中全部的組件都要依賴它
其中,org.springframework.context.ApplicationContext接口表示Spring IoC容器,並負責實例化、配置和組裝bean。容器經過讀取配置元數據獲取關於實例化、配置和組裝哪些對象的說明。配置元數據用XML、Java註釋或Java代碼表示。它容許您表達組成應用程序的對象以及這些對象之間豐富的相互依賴關係。
Spring提供了ApplicationContext接口的幾個實現。在獨立應用程序中,一般建立ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的實例。
雖然XML一直是定義配置元數據的傳統格式,可是您能夠指示容器使用Java註釋或代碼做爲元數據格式。如今絕大多數都是用的Java註釋,SpringBoot引入以後,更是如此,不過咱們傳統的Spring項目幾乎都是xml配置文件,因此咱們也首先從xml配置文件管理Bean的方式提及。畢竟,咱們就是爲了解耦,將硬編碼寫到配置文件中去。
ok,咱們閒話少說,先看一個示例吧。
首先,咱們引入依賴:
<!-- 官方建議用spring-boot來開啓spring的學習,咱們引入這個,主要是爲了統一管理版本 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.2.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> </dependency> <!-- ps: 這就是maven方便的地方,spring-context中已經把core、beans都引入進來了 --> </dependencies>
引入該依賴以後,基本的依賴包均已引入,如圖所示:
接下來,咱們就能夠開始寫一個簡單的測試用例了:
新建一個pojo(普通javaBean)
public class MyTestBean { private String testString = "testBean"; public String getTestString() { return testString; } public void setTestString(String testString) { this.testString = testString; } }
而後,編寫beanFactoryTest.xml配置文件
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 能夠查看官網,將官網中的示例下載下來,而後根據實際須要更改 --> <bean id="myTestBean" class="top.djlee.spring.ioc.pojo.MyTestBean"> </bean> <!-- ps: id屬性是標識單個bean定義的字符串。 class屬性定義bean的類型並使用徹底限定的類名。 固然,Bean的定義不只僅如此,不過基本上這兩個定義就足夠咱們的應用了。 --> </beans>
最後,咱們來寫一個主類,去測試一下是否可以注入:
public class FirstIocDemo { public static void main(String[] args) { @SuppressWarnings("resource") ApplicationContext context = new ClassPathXmlApplicationContext("beanFactoryTest.xml"); MyTestBean myTestBean = context.getBean("myTestBean",MyTestBean.class); System.out.println(myTestBean); } }
//輸入內容:MyTestBean [testString=testBean]
至此,咱們一個簡單的SpringIOC就實現了。
經過這個示例,咱們看到了,Spirng幫咱們作了以下的事:
讀取配置文件->根據beanFactoryTest.xml文件中的配置找到對應的類,並實例化,放到context中去->從context中拿到這個類並調用之.
固然,SpringIOC固然不只僅如此,咱們只是爲了演示方便,將最簡單的應用提出來,在接下來的文章中,咱們就會就這這個簡單的應用去嘗試着分析Spring-IOC的原理,與你們一塊兒走進Spirng-IOC的世界。