Spring-Framework核心知識點----IOC

首先:認識Spring,Spring是輕量級開發框架,可以它將各部分功能模塊化,使用Spring框架時只需添加使用到的jar包即可。
此外,Spring是非侵入型框架,代碼無需繼承框架的類,對框架沒有依賴性,從編寫者的角度來說,察覺不到框架的存在。
Spring能幫我們做什麼?
1 動態解耦,方便開發,面向接口設計
2 方便程序測試
3 降低java EE api的使用難度
4 方便繼承各種優秀框架,Spring能兼容優秀的開發,與他們協同工作。
5 支持面向切面編程AOP
6 聲明式事務管理
7 模塊化編程
總的來說,Spring能幫我們簡化代碼,降低耦合。
Spring是非侵入性框架,爲什麼還要導jar包?
我們所書寫的java代碼不需要繼承Spring中的類或者是實現Spring中的方法,將Spring的jar移除原來的java代碼並不會保存。引用jar包是爲了在Spring功能模塊中使用
Spring中的IOC(Inversion Of Control)
IOC中幾個重要的概念:

IOC :Spring的核心容器就是IOC容器,它負責管理各種對象的生命週期(創建、初始化、使用、銷燬),它僅僅實現此功能,但是,它讓我們的可以減少代碼,不用考慮複雜的耦合關係就可以從IOC容器中獲取對象,而且提供了可靠的管理。
DI(Dependency Injection): 依賴注入。表示讓調用類對某一接口實現類的依賴關係由容器注入,以移除調用類對某一接口實現類的依賴。
DL:Dependency Loopup: 依賴查找。容器創建對象並提供回調接口和上下文環境給這個對象,需要時通過接口從容器中查找其他對象

1 使用set方式進行對象的注入
主要是通過Spring容器調用setXxx()方法進行注入,形式如下:
首先在xml配置文件裏面進行配置
<?xml version="1.0" encoding="UTF-8"?>

	<bean name="stu" class="com.briup.bean.Student">
		<property name="id" value="1"></property>
		<property name="age" value="22"></property>
		<property name="name" value="小明"></property>
	</bean>
	
	
	
	<bean name="tea" class="com.briup.bean.Teacher">
		<property name="id" value="2"></property>
		<property name="name" value="嘿嘿嘿"></property>
		<property name="student" ref="stu"></property>
	</bean>
	
</beans>

然後在測試類中通過構建Spring容器獲取到配置的bean對象
String path = "ioc/set/set.xml";
ApplicationContext context = 
		new ClassPathXmlApplicationContext(path);
Student stu = (Student) context.getBean("stu");
Teacher tea = (Teacher) context.getBean("tea");
在<bean></bean>標籤裏的屬性中,id和name都可以唯一標識一個bean,但是在name裏面使用空格表示同時給bean對象取多個別名,在id中無意義表示爲id的一部分。
Spring容器用單例模式管理bean對象,但是需要注意的是,只有每次在container.getbean("bean對象");  每次bean對象的名字一樣時纔是取同一個對象,他們的地址值一樣;如果bean對象的名字不一樣,他們的值也是不一樣的。

2 使用構造器方式進行注入
構造器注入有倆種形式 一個是根據參數類型 一個是根據參數位置的下標
使用參數類型或者下標構造bean對象的話會可能會出現問題,在兩個構造器的參數類型都是一樣的情況下,只會按順序執行,最終只執行位於代碼最後的那個構造器。所以推薦使用下標的同時添加一個加上name參數指定對應的參數。
通過參數類型匹配還會出現另一個問題,當構造器的數據類型都是一樣時,會出現數據混亂



3 自動注入
自動注入分兩種方式:一個是byName,一個是byType
使用:只需要在bean標籤裏面添加一個autowrie參數。使用byName方式不會報錯,使用byName根據properties的名字自動匹配是否存在這個名字的bean對象,如果存在一個,自動注入,否則不注入,不報錯;
使用byType根據bean對象的類型進行匹配,如果只存在一個該類型的bean對象,就對該進行相應的值注入;如果存在一個以上的該類型的bean對象,就進行報錯。
4 繼承
bean的繼承其實就是java中的繼承,只是他們的表示方式不一樣。
在bean中繼承不需要重新寫一個類,子類bean對象無需寫class參數(想寫也沒有),採用parent參數直接對另一個bean進行繼承,可以達到同樣的效果。此時的子類bean的類型時和父類的是保持一致的,並且繼承了父類bean參數的值。








<bean name="newTeacher" parent="teacher">
	<property name="student" ref="student"></property>
</bean>

Spring管理bean的生命週期
完整的生命週期(瞭解):實現類bean類中可以實現的所有接口,有完整的10部分生命週期
不完整的生命週期(平時使用的):常用到的bean類只要創建、初始化(依賴注入)、使用、銷燬這幾個階段

Spring容器中xml配置文件的讀取
1 將所有的xml配置文件一下子讀取進來(使用String[]數組的方式)
String[] path = {“com/briup/ioc/autowried/aotuwried.xml”,“com/briup/ioc/set/set.xml”};
ApplicationContext context = new ClassPathXmlApplicationContext(path);

2 將所有的xml配置文件導入到一個xml配置文件中然後將這一個xml配置文件進行讀取
import.xml文件:
<import resource="teacher.xml"/>
<import resource="student.xml"/>
然後在代碼中直接把這一個xml配置文件讀取就可以了

註解:
使用註解需要仍然需要配置xml文件,需要告訴Spring容器使用了哪個bean使用了標籤。
一般使用context:annotation-config/就可以配置了
但是如果要使用註解配置bean對象,使用到了@Component標籤,就要使用<context:component-scan base-package=“com.briup.ioc.annotation”></context:component-scan>進行配置

小結:
IOC也就是控制反轉,誰被誰控制?被控制了什麼?誰又被反轉了?
誰被誰控制?被控制了什麼?
在使用Spring之前,我們創建對象以及對象之間的聯繫是通過程序主動去創建對象;而使用了Spring之後,由IOC容器來控制對象的創建;所有控制就是IOC容器控制了對象,控制了外部資源的獲取。
誰又被反轉了?不用Spring之前是我們自己在對象中主動控制去直接獲取對象,使用了Spring,IOC容器幫我們創建對象並注入了依賴。由主動變成了被動,這就是反轉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章