Spring框架基礎01

-Spring框架基礎

1、框架簡述
所謂的框架其實就是程序的架子,在這個程序的架子中,針對程序的各種問題給出了便捷的解決方案,可以使開發人員基於框架快速開發具體的應用程序。

2、常見的框架有

SSH:Struts2、Spring、Hibernate、

SSM:SpringMVC、Spring、MyBatis

Spring框架簡述

1、Spring是一個Service層的框架,可以整合許多其他框架進行工作
Spring的主要技術是IOC(DI) AOP

IOC(DI)-控制反轉(依賴注入)
AOP-面向切面編程

Spring本身是基於XML配置來進行工作的,在使用Spring的過程中不可避免要編寫大量的XML文件配置,
Spring官方提供了這些XML文件的編寫規範,這是通過提供XML的約束文件來實現的。
所謂的Xml約束其實是一種限定Xml文件寫法的技術,主要分爲兩種:

DTD,通常文件的後綴.dtd
Schema,通常文件的後綴爲.xsd ,Spring提供了Schema格式的約束,來限定Spring配置文件的寫法。

Spring的IOC(DI)

1、IOC(DI)-控制反轉(依賴注入)

所謂的IOC稱之爲控制反轉,簡單來說就是將對象創建的權力以及對象生命的週期的管理過程交由Spirng框架來處理,從此在開發過程中不再需要關注對象的創建和生命週期的管理,而是在需要是由Spring框架提供,這個由Spring框架管理對象創建的生命週期的機制稱之爲控制反轉。 在創建對象的過程中Spring可以依據配置 對 對象的屬性進行設置,這個過程稱之爲依賴注入–DI

IOC的事項原理

在初始化一個Spring容器時,Spring會去解析指定的XML文件,當解析到其中的標籤時,會根據該標籤中的class屬性指定的類的全路徑名,通過反射創建該類的對象,並將該對象存入內置的Map中管理,其中鍵就是該標籤的id值,值就是對象。

之後,當通過getBean方法來從容器中獲取對象時,其實就是根據傳入的條件,在內置的Map中尋找是否有與之相匹配的值,如果有則將該鍵值對中保存的對象返回,如果沒有匹配到則拋出異常。

默認情況下,多次獲取同一個id的bean,得到的是同一個對象。
即使是同一個類,如果配置多個標籤具有不同的id,每個id都會在內置的Map中有一個鍵值對,其中的值是這個類創建的不同的對象。
同一個標籤下不允許配置多個同id的標籤,若依舊配置則拋出異常

IOC的獲取對象的方式

通過context.getBeans()方法獲取bean時,可以通過如下兩種方法獲取

1、傳入id值

ApplicaitonContext context = new ClassPathApplicationContext(“applicationContext.xml”);

Person p01 = (person)context.getBean(“person”);

2、傳入class類型

ApplicaitonContext context = new ClassPathApplicationContext(“applicationContext.xml”);

Person p01 = (person)context.getBean(Person.class);

通過class方式獲取bean時,如果同一個類配置多個bean,則再獲取時因爲無法確定到底要獲取哪個bean會拋出異常。但id是唯一的,不存在類似的問題,所以建議使用id獲取bean

Spring創建對象的方式

1、通過類的無參構造方法創建對象,當用最普通的方式配置一個時,默認就是採用類的無參構造創建對象,在Spring容器初始化時,通過上配置的class屬性反射得到字節碼對象,通過newInstance()創建對象。
Class c = Class.forname(“類的全名稱路徑”);
Object obj = c.newInstance();
這種方式下Spring創建對象,要求類中必須有無參構造,否則無法通過反射創建對象,從而拋出異常。

2、通過靜態工廠創建對象
很多的時候,我們面對的類是無法通過無參構造去創建的,例如該類沒有無參構造、是一抽象類 等等情況 ,此時無法要求spring通過無參構造創建對象,此時可以使用靜態工廠方式創建對象。

3、通過實例工廠創建對象

實例工廠也可以解決類是無法通過無參構造創建的問題,解決的思路和靜態 工廠類似,只不過實例工廠提供的方法不是靜態的。spring需要先創建出實例工廠的對象,在調用實例工廠對象上指定的普通方法來創建對象。所以實例工廠也需要配置到Spring中管理。

4、Spring工廠創建對象

Spring內置了工廠接口,也可以通過實現這個接口來開發Spring工廠,通過這個工廠創建對象。

單例和多例

Spring容器管理的bean在默認情況下是單例的,也即,一個bean只會創建一個對象,存在內置map中,之後無論獲取多少次該bean,都返回同一個對象。
Spring默認採用單例方式,減少了對象的創建,從而減少了內存的消耗。
但是在實際開發中是存在多例的需求的,Spring也提供了選項可以將bean設置爲多例模式。

bean在單例模式下的生命週期:

bean在單例模式下,spring容器啓動時解析xml發現該bean標籤後,直接創建該bean的對象存入內部map中保存,此後無論調用多少次getBean()獲取該bean都是從map中獲取該對象返回,一直是一個對象。此對象一直被Spring容器持有,直到容器退出時,隨着容器的退出對象被銷燬。

bean在多例模式下的生命週期:

bean在多例模式下,spring容器啓動時解析xml發現該bean標籤後,只是將該bean進行管理,並不會創建對象,此後每次使用 getBean()獲取該bean時,spring都會重新創建該對象返回,每次都是一個新的對象。這個對象spring容器並不會持有,什麼銷燬取決於使用該對象的用戶自己什麼時候銷燬該對象。

懶加載機制
Spring默認會在容器初始化的過程中,解析xml,並將單例的bean創建並保存到map中,這樣的機制在bean比較少時問題不大,但一旦bean非常多時,spring需要在啓動的過程中花費大量的時間來創建bean 花費大量的空間存儲bean,但這些bean可能很久都用不上,這種在啓動時在時間和空間上的浪費顯得非常的不值得。
所以Spring提供了懶加載機制。所謂的懶加載機制就是可以規定指定的bean不在啓動時立即創建,而是在後續第一次用到時才創建,從而減輕在啓動過程中對時間和內存的消耗。

懶加載機制只對單例bean有作用,對於多例bean設置懶加載沒有意義。

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