什么是Spring
------開源的,控制反轉(Inversion of Control)和面向切面的容器框架。
Spring核心:
IOC(控制反轉)-------創建對象並且組裝對象之間的關系。
IOC:應用程序本身不負責依賴對象的創建和維護,依賴對象的創建和維護是由外部容器負責的。這樣控制權就由應用程序轉移到了外部容器。控制權的轉移就是所謂的反轉。
依賴注入:Dependency Injection:在運行時由外部容器將依賴對象注入到組件中。
為什么使用Spring
1:降低組件之間的耦合度,實現各層之間的解耦
2:可以使用容器提供的眾多服務。如:
--事務管理服務
--JMS
--Spring core核心服務
--持久化服務
--其他
3:提供了單例模式支持。開發人員不需要自己編寫實現代碼
4:提供了AOP技術。實現如:權限攔截,運行監控等功能
5:提供了眾多的輔助類。如JDBC Template,HIbernate Template
6:對主流的應用框架提供了集成支持。集成Struts,JPA,Hibernate
spring的7個模塊
spring核心容器(Core)
spring上下文
springAOP
SpringDAO
SpringORM
springWeb支持struts集成
springMVC自帶的mvc框架
spring實現的2種設計模式
單態模式:接受容器管理的bean,默認采用單態模式管理。
工廠模式:spring就是實例化和管理全部bean的工廠。spring的上下文也就是工廠,也被設計成單態的
spring的依賴注入(也叫控制反轉Ioc)實現策略有3種
依賴查找
依賴注入:接口注入(如Context.lookup)、構造注入、設置值注入。
注:利用反射來實現的。
設置值注入優點
與javabean類似,直觀、自然、不臃腫、
構造注入優點
決定注入順序
缺點:臃腫
IOC容器優缺點
優點:實現對象的熱插拔。
缺點:步驟復雜、利用反射使效率損耗、缺少IDE重構支持。
spring容器:BeanFactory和ApplicationContext
之間是父子的關系
Spring實例化bean的三種方式
1:默認使用類加載器
2:使用靜態工廠方法實例化bean對象
<bean id="名稱" class="工廠類" factory-method="工廠類中創建bean實例的方法"/>
3:使用實例工廠方法實例化bena對象
<bean id="實例工廠名稱" class="工廠類的路徑"/>
<bean id="名稱" factory-bean="實例工廠名稱" method="實例工廠里邊的創建bena對象的方法"/>
Spring管理的bean的作用域
Spring生成的bean默認為單實例。singleton。
如果需要每次調用Spring的getBean方法就創建一個 bean的實例,可指定bean的屬性scope="prototype"
還有:request、session、global session 這3個一般基於web的spring ApplicationContext情形下有效。
Spring的生命周期
bean的實例化:
1:當作用域范圍為singleton時,在初始化Spring容易的時候實例化bean實例。
---1:如果lazy-init的值為true,則為延遲bean的實例化,即在Spring容器啟動時不實例化bean的對象
2:當作用域范圍為prototype時,在調用Spring的getBean的方法時實例化bean對象
注入依賴對象可以采用手工裝配或者自動裝配,在實際應用中建議采用手工裝配。因為自動裝配會產生未知情況,開發人員無法預見最終的裝配結果。
加載spring有2種方式(略)
bean的屬性
id 命名bean
class 實例化的類
factory-method 指定工廠方法
factory-bean 指定工廠類
scope 指定bean的作用域
depends-on 指定依賴bean
lazy-init 延遲初始化bean
init-method 初始化回調
destory-method 析構回調
parent 繼承bean
bean的子元素
<property>子元素
直接value屬性、使用子<value>、使用<ref>子元素指向另一個bean
此外property還可以包含集合:<list> <set> <map> <props>他們分別對應List Set Map Properties的值
<constructor-arg>子元素
用type指定參數類型、value指定輸入參數的值
用ref屬性指定其他的bean
使用<ref>子元素指向另一個bean
springAOP
AOP 是一個概念,一個規范,本身並沒有設定具體語言的實現,這實際上提供了非常廣闊的發展的空間。AspectJ是AOP的一個很悠久的實現,它能夠和 Java 配合起來使用。
AOP是OOP的延續,是Aspect Oriented Programming的縮寫,意思是面向方面編程。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。
AspectJ 中幾個必須要了解的概念:
Aspect: Aspect 聲明類似於 Java 中的類聲明,在 Aspect 中會包含着一些 Pointcut 以及相應的 Advice。
Joint point(連接點):表示在程序中明確定義的點,典型的包括方法調用,對類成員的訪問以及異常處理程序塊的執行等等,它自身還可以嵌套其它 joint point。
Pointcut(切入點):表示一組 joint point,這些 joint point 或是通過邏輯關系組合起來,或是通過通配、正則表達式等方式集中起來,它定義了相應的 Advice 將要發生的地方。
Advice(通知):Advice 定義了在 pointcut 里面定義的程序點具體要做的操作,它通過 before、after 和 around 來區別是在每個 joint point 之前、之后還是代替執行的代碼。
注:如果沒有實現接口,需要引入cglib
[轉載http://wxg6203.iteye.com/blog/767100]