1,什麼是spring框架
spring是J2EE應用程序框架,是輕量級的IoC和AOP的容器框架,主要是針對javaBean的生命週期進行管理的輕量級容器,可以單獨使用,也可以和Struts框架,ibatis框架等組合使用。
2,架構概述
1)IoC(Inversionof Control)控制反轉,對象創建責任的反轉,在spring中BeanFacotory是IoC容器的核心接口,負責實例化,定位,配置應用程序中的對象及建立這些對象間的依賴。XmlBeanFacotory實現BeanFactory接口,通過獲取xml配置文件數據,組成應用對象及對象間的依賴關係。
spring中有三種注入方式,一種是set注入,一種是接口注入,另一種是構造方法注入。
2)AOP面向切面編程
aop就是縱向的編程,如下圖所示,業務1和業務2都需要一個共同的操作,與其往每個業務中都添加同樣的代碼,不如寫一遍代碼,讓兩個業務共同使用這段代碼。
spring中面向切面變成的實現有兩種方式,一種是動態代理,一種是CGLIB,動態代理必須要提供接口,而CGLIB實現是有繼承。
3,爲什麼使用spring框架
在不使用spring框架之前,我們的service層中要使用dao層的對象,不得不在service層中new一個對象。如下:
存在的問題:層與層之間的依賴。
使用框架後:
service層要用dao層對象需要配置到xml配置文件中,至於對象是怎麼創建的,關係是怎麼組合的都交給了spring框架去實現。
4,框架優點
輕量級的容器框架沒有侵入性
使用IoC容器更加容易組合對象直接間關係,面向接口編程,降低耦合
Aop可以更加容易的進行功能擴展,遵循ocp開發原則
創建對象默認是單例的,不需要再使用單例模式進行處理
5,缺點:業務功能依賴spring特有的功能,依賴與spring環境。
spring框架爲我們提供了三種注入方式,分別是set注入,構造方法注入,接口注入。接口注入不作要求,下面介紹前兩種方式。
A:set注入
採用屬性的set方法進行初始化,就成爲set注入。
1)給普通字符類型賦值。
我們只需要提供屬性的set方法,然後去屬性文件中去配置好讓框架能夠找到applicationContext.xml文件的beans標籤。標籤beans中添加bean標籤, 指定id,class值,id值不做要求,class值爲對象所在的完整路徑。bean標籤再添加property標籤,要求,name值與User類中對應的屬性名稱一致。value值就是我們要給User類中的username屬性賦的值。
2)給對象賦值
同樣提供對象的set方法
配置文件中要增加UserService的bean標籤聲明及User對象對UserService引用。
這樣配置,框架就會將UserService對象注入到User類中。
3)給list集合賦值
同樣提供set方法
4)給屬性文件中的字段賦值
<prop>標籤中的key值是.properties屬性文件中的名稱
注意:
無論給什麼賦值,配置文件中<property>標籤的name屬性值一定是和對象中名稱一致。
B:構造方法注入
1)構造方法一個參數
2)構造函數有兩個參數時
當參數爲非字符串類型時,在配置文件中需要制定類型,如果不指定類型一律按照字符串類型賦值。
當參數類型不一致時,框架是按照字符串的類型進行查找的,因此需要在配置文件中制定是參數的位置
這樣制定,就是構造函數中,第一個參數爲string類型,第二個參數爲int類型
註解Annotation,是一種類似註釋的機制,在代碼中添加註解可以在之後某時間使用這些信息。跟註釋不同的是,註釋是給我們看的,java虛擬機不會編譯,註解也是不編譯的,但是我們可以通過反射機制去讀取註解中的信息。註解使用關鍵字@interface,繼承java.lang.annotition.Annotition
spring框架爲我們提供了註解功能。
使用註解編程,主要是爲了替代xml文件,使開發更加快速。但是,xml文件的使用就是解決修改程序修改源代碼,現在又不去使用xml文件,那麼不就違背了開閉原則了麼,得確是。不過麼,註解也有註解的好,使用註解就不用配置那麼多的xml文件啦,最重要的是開發效率高。。
在沒有使用註解時,spring框架的配置文件applicationContext.xml文件中需要配置很多的<bean>標籤,用來聲明類對象。使用註解,則不必在配置文件中添加標籤拉,對應的是在對應類的“註釋”位置添加說明。具體介紹如下:
spring框架使用的是分層的註解。
持久層:@Repository;
服務層:@Service
控制層:@Controller
1,使用註解,需要在配置文件中增加命名空間和約束文件
2,告訴框架那些類是使用註解的。
<context:component-scan base-package="com.lsz.spring"/>
3,持久層註解
@Repository 等同於配置文件中的
4,服務層註解
@Resource 對象間關係的組合,默認採用的是byName方式進行裝配,如果根據名稱查找不到關聯的對象,那麼會再採用byType繼續查找。
@Service註解等同與
5,控制層註解
@Controller註解等同於
這三個層中的註解關鍵字都可以使用@Component來代替。
使用註解聲明對象,默認情況下生成的id名稱爲類名稱的首字母小寫。
6,從Spring環境中獲取Action對象。
AOP(Aspect-OrientedProgramming)面向方面編程,與OOP完全不同,使用AOP編程系統被分爲方面或關注點,而不是OOP中的對象。
在OOP面向對象的使用中,無可避免的會出現代碼重複,而且使用面向對象的編程方式,這種重複無法避免,比如用戶權限判斷中,根據相應的權限執行相應的方法;在servlet中設置編碼格式時,同樣相同的代碼出現很多次,而且還根業務無關,很容易忘記寫,結果運行的時候就出現亂碼拉。這種重複代碼不僅使編碼麻煩,而且還不容易維護。而AOP則將這些代碼整理起來,將解決某個切面問題的代碼單獨的放在某個模塊中,然後再織入到程序中。
Aspect:橫切面的功能, 抽象出類,或接口, AOP編程重要的就是識別出橫切面功能。
(方面,類似於字符編碼功能)
Advice: 橫切面功能的具體實現,需要根據實際的情況分析,如果在目標對象操作之前是 before在操作之後,就是 after advice。
(增強,類似於字符編碼過濾器)
Pointcut:切入點,描述橫切面功能應用的限制,不是所有的流程都需要,那些可以使用的地方就是切入點
(類似於過濾器的匹配規則 /*)
Joinpoint: 連接點,或指組件加入流程的時機,比如設置屬性,調用方法,等,Spring只支持方法調用的連接點,而其他的一些框架支持屬性的連接點如:AspectJ,
(類似於過濾器的過濾規則 REQUEST,FORWARD)
Weave: 縫合,將組件應用到業務流程中的這個過程,叫縫合或織入。
(類似於將過濾器配置到web.xml文件的過程)
Proxy,代理,在實現上,Spring的AOP其實就是使用JDK的動態代理(使用接口的方式完成代理操作),也可以使用CGLIB(使用繼承的方式完成代理操作)。
Target,目標,業務操作的實際對象
實例:設置字符編碼格式看作是一個Aspect方面,而攔截器就是一個Advice增強。
過濾器類
這樣就不用在每個servlet中設置編碼拉。。
啓用aop功能:就把標籤添加進來就可以拉。
成功的話,執行目標類中的目標方法targetmethod()時,會先執行擴展類中的beforemethod()方法,再執行目標方法,最後再執行aftermethod()方法。
也就是我們只需要手動調用targetmethod方法,擴展類中的兩個方法框架會在執行的時候通過讀取配置文件,獲取相應信息,自動給我們添加上擴展的方法。。
測試肯定成功,不相信的話,可以自己試試。
Spring框架中使用AOP的優點
Aop與spring的IOC容器整合,增強,切入點都是javabean,可以在同一文件中配置
和spring的其他部分一樣,可以在不同應用服務器之間任意移植
spring實現Aop的攔截接口,使得用戶不必綁定在特定的攔截器接口上
aop面向切面的編程思想,打破面向對象的思維方式,我們要學習的不僅是aop的使用,更要學習面向切面的這種思想。