1. 程式人生 > >Spring之IOC配置原理

Spring之IOC配置原理

前言:今天不說spring boot,來探討一下spring的配置檔案。spring的核心就是IOC和AOP,下面說的就是IOC。

IOC:術名控制反轉,第一次聽這個肯定一頭霧水,沒關係,下面就來認識一下這個陌生面孔。建立物件的方式一般分為兩種,一種是平時用的最多,直接new物件,還有一種是利用java提供的反射機制建立物件,IOC的底層就是反射。

1、普通的建立物件方式

PersonServiceOfNormal類為例

public class PersonServiceOfNormal {
	public PersonServiceOfNormal() {
		System.out.println("我是new出來的物件,被初始化了。。。");
	}
}

Test方法 

@Test
void testPersonServiceOfNormal() {
	PersonServiceOfNormal person = new PersonServiceOfNormal();
}

 執行結果如下,物件被初始化,沒問題

2、反射創建出來的物件

PersonServiceOfReflect類為例

public class PersonServiceOfReflect {
	
	public PersonServiceOfReflect() {
		System.out.println("我是反射出來的物件,被初始化了。。。");
	}

}

Test類

@Test
	void testPersonServiceOfReflect() throws Exception {
		Class<?> classPerson = Class.forName("cn.zdxh.service.PersonServiceOfReflect");
		PersonServiceOfReflect person=(PersonServiceOfReflect) classPerson.newInstance();
	}

通過Class類的靜態方法forName傳入類的名稱獲得對應的class類,再通過newInstance方法構造物件,這就是發射的構造物件方法

執行結果,物件被成功初始化

3、spring的IOC

說得通俗點,spring的IOC就是通過解析xml檔案的配置資訊建立物件以及設定其他屬性。

為什麼僅僅只配置一個類名,spring框架就可以幫我們建立物件並管理物件?(這裡以bean節點為例)

通過檢視原始碼,DefaultBeanDefinitionDocumentReader類中有個parseBeanDefinitions方法,其作用就是解析配置的節點,再用解析出來的節點屬性值來建立物件以及做其他的操作,物件的生命週期則是通過監聽容器來管理的

以下的屬性被解析(部分)

 根據這個屬性,自己定義一個xml檔案,然後解析檔案,再建立物件

首先,在eclipse中配置一個tomcat可讀取訪問的系統路徑

 再把自定義的配置檔案放到該資料夾下,節點內容隨便怎樣寫,只要按照一定的方式解析就行

<?xml version="1.0" encoding="UTF-8"?>
<configure>
<beans>
	<bean value="cn.zdxh.service.PersonServiceOfXmlReflect"/>
	<bean value="cn.zdxh.service.PersonServiceOfReflect"/>
</beans>
</configure>


新添一個PersonServiceOfXmlReflect類作為演示

public class PersonServiceOfXmlReflect {
	public PersonServiceOfXmlReflect() {
		System.out.println("我是通過解析xml反射出來的物件,被初始化了。。。");
	}
}

示例採用dom4j解析xml檔案,相關的jar包在網上搜索下載即可

Test類

        @Test
	void testPersonServiceOfXmlReflect() throws Exception {
		
		SAXReader saxReader = new SAXReader();
		//讀取指定資料夾的xml檔案
		Document document = saxReader.read(new File("E:/upload/picture/configure.xml"));
		Element element = document.getRootElement();

		//獲得beans節點下的所有的bean子節點,根節點不讀取
		List<Element> listBeans=element.element("beans").elements("bean");
		if(listBeans!=null && listBeans.size()>0) {
			//遞迴遍歷父節點下的所有子節點
		     for(Element e : listBeans){
		    	//獲得所有的bean標籤裡面的值
		     		Class<?> classPerson = Class.forName(e.attributeValue("value"));
		     		//反射建立所有的物件
		     		Object newInstance = classPerson.newInstance();
		     }
		}
	}

執行結果,兩個配置的類被成功初始化

 總結:IOC的大概設計思想就是這樣,無論是新秀ssm框架還是舊將ssh框架,只要把握好設計思想,學起來就沒那麼辛苦。最後一句,java大法好!