IOC簡單介紹
ioc被稱作控制反轉,也被稱爲依賴注入(DI)。是spring中重要的一部分,它是spring框架的重要組成之一,我們可以將ioc比作一個容器,而它的作用就是幫助我們new 對象,管理對象的。
控制反轉理解
那麼我將自己對控制反轉的理解簡單說一下,控制反轉其實是spring中的一種機制,我們之前是怎麼創建對象的?簡單來說就是自己手動去new,當我們想對該對象進行一些屬性的操作呢?我們就會通過構造函數,屬性調用對其賦值,而IOC會怎麼來幫助我們創建對象呢?首先分爲兩種,一種是無參創建,還有一種是有參創建,無參創建我們可以理解爲無參構造函數創建對象,不對其進行任何屬性賦值,有參便是通過有參構造函數創建對象,將對其屬性進行一些賦值。
簡單用圖說明一下控制反轉:
傳統方式:
創建對象----->對對象進行一些屬性賦值
spring ioc:
要對對象賦的值---->給ioc容器----->ioc容器依據屬性創建對象(注意ioc創建對象也是利用構造函數,因此需要創建的對象的類必須有構造函數)
如此我們可以體會到控制反轉的精妙之處,這也是spring框架的一大特色。
創建對象的方式
創建對象有多種方式,這裏我只介紹兩種,一種是傳統方式創建,當然傳統方式裏也有多種,我只介紹最簡單的一種,通過構造函數創建,僅僅是用來區別spring ioc容器創建。
傳統方式創建:
(1)創建student類
public static Student{
private int id;
private String name;
private int age;
//無參構造函數程序默認給出
}
這裏自行實現setter,getter,toString方法。
(2)測試方法調用構造函數創建對象
Student student=new Student();
IOC容器創建對象
實現步驟:
(1)在pom.xml中添加spring依賴
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
(2)創建配置文件,可以自定義文件名,比如spring.xml
(3)在spring.xml中配置bean標籤,IOC容器通過加載bean標籤來創建對象
(4)調用API獲取IOC創建的對象
IOC容器創建對象同樣有兩種,無參構造和有參構造,無參和有參構造我在上邊已經解釋了,不理解的同學可以再往上看一看。
IOC容器通過無參構造方式創建對象
<!--配置Student對象,IOC通過這個bean來創建對象-->
<bean id="stu" class="entity.Student"</bean>
<!--id可以理解爲這個bean的名字,後面會用到,class是上面創建Student類的目錄路徑-->
接下來我們通過調用API來獲取對象,Spring提供了兩種方式來獲取對象,一種是id,一種運行時類
通過id獲取對象
public class ApplicationContext {
public static void main(String[] args){
AbstractApplicationContext applicationContext=new ClassPathXmlApplicationContext("spring.xml");
//通過id獲取對象
Student stu=(Student)applicationContext.getBean("stu");
System.out.println(stu);
//通過運行時類獲取對象
Student stu1=applicationContext.getBean(Student.class); //此時可不聲明強轉,因爲我們是通過類的反射機制獲取的,但是也有弊端
System.out.println(stu1);
}
}
這裏注意需要導包。
運行結果:
通過上圖我們可以看到,通過無參構造方式創建的對象屬性值都是0或null,這也證明了一點IOC確實是通過構造函數來創建對象的,那麼我們讓其屬性具有一些值呢?這裏我們需要在bean標籤中添加property屬性,我們可以理解爲傳統方式的屬性調用。下面我們舉例說明以下:
<bean id="stu" class="entity.Student">
<property name="id" value="1"></property>
<property name="name" value="jacob"></property>
<!--age值我不進行操作,以此來說明property的作用-->
</bean>
運行結果:
我們可以看到,id和name均已有值,而age還是無值狀態。
IOC容器通過有參構造方式創建對象
(1)在實體類中創建有參構造
public class Student {
private int id;
private String name;
private int age;
//創建有參構造函數
public Student(int id,String name,int age){
this.id=id;
this.name=name;
this.age=age;
}
(2)在spring.xml中進行配置
<bean id="stu" class="entity.Student">
<constructor-arg name="id" value="3"></constructor-arg>
<constructor-arg name="name" value="jacob"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
</bean>
<!--注意這裏一定要寫constructor-arg,不然會報錯,報錯原因是當我們寫出有參構造函數時,程序中默認的無參就不存在了-->
運行結果:
這裏補充一點,我們之前在寫項目的時候遇到很多類中包含類的情況,也就是級聯關係,那麼ioc容器怎麼處理呢?我們一起來看看吧!
在spring.xml中,通過ref屬性將其他bean賦給當前bean對象,這種方式叫做依賴注入(DI),是spring非常重要的機制,DI是將不同對象進行關聯的一種方式,是IOC的具體實現方式,所以IOC和DI通常是緊密結合在一起的,因此一般說IOC包括DI。
總結:
IOC可以理解爲一個能創建對象的容器,它具有控制反轉和依賴注入的特性,控制反轉就是依據屬性值創建對象,依賴注入就是將兩個不相關的對象聯繫起來,讓其中一個對象包含在另一個對象之中。IOC容器創建對象有兩種方式,一種是無參構造一種是有參構造,我們都可以將它們理解爲之前我們所學的有參構造函數和無參構造函數創建對象,這也證明了IOC其實也是通過構造函數來創建對象的,IOC容器通過加載spring.xml配置文件來創建對象,之後我們通過API來獲取這些對象,獲取方式也有兩種,一種是通過id來獲取,另一種是通過類.class來獲取,雖然獲取結果一樣,但後者有一些弊端,那就是假如在spring.xml配置文件中有兩個Student的bean,程序就會報異常,因爲此時兩個bean都是由Student類生成的,IOC容器無法將兩個bean都返回,必須指定一個唯一的bean。我們需要注意IOC是通過構造函數來創建對象的,所以所需創建的對象類必須有構造函數,且必須有setter方法。
以上便是我對這一部分的理解,如果有錯誤或者你有其他疑惑都可以留言給出,我都會一一進行回覆,希望對你有所幫助,如果寫的不好也請您多多包涵。歡迎在下方補充留言喲。
對SSM框架感興趣的童鞋,可以移步這裏,在這裏你可以快速的搭建好一個SSM框架。