【使用SSM框架開發企業級應用】Spring核心概念
Spring核心概念
單詞
Inversion倒置
Control控制
Dependency從屬
Injection注入
Adpect-oriented面向切面
Programming程式程式設計
Advice忠告
Aspect方向
Alliance聯合
Pointcut切入點
Weaving編制
Signature署名
Expreession表現
Execution執行
Spring IoC
Spring IOC簡介
beans和context包是IOC容器的基礎,BeanFactory 提供的高階配置機制,使得管理各種物件成為可能。 ApplicationContext 是BeanFactory的擴充套件,功能得到了進一步增強,比如更易 與Spring AOP整合、資源處理(國際化處理)、事件傳遞及各種不同應用層的context實現 (如針對web應用的WebApplicationContext)。總之,在實際應用更多會選擇ApplicationContext,原因是ApplicationContext即繼承了BeanFactory的功能,同時又增加的更多支援企業核心內容的支援。
Spring IOC關鍵概念理解
IOC(Inversion of Control):控制反轉,即指獲取物件的方式被反轉了,我們只需要在applicationContext.xml(Spring的配置檔案)檔案配置元資料(即指xml)中的bean指定相應class(類)的全路徑,Spring中的容器(BeanFactory)會負責類物件的建立、配置和管理這些物件及它們之間的依賴關係,而且這些物件和我們通過new Object()的物件沒有區別,這樣最終會達到解耦的目的(即減少程式碼之間的依賴);
Bean:在Spring中,那些組成你應用程式的主體(backbone)及由Spring IoC容器所管理的物件,被稱之為bean。 簡單地講,bean就是由Spring容器初始化、裝配及管理的物件,除此之外,bean就與應用程式中的其他物件沒有什麼區別了。 而bean定義以及bean相互間的依賴關係將通過配置元資料來描述。
容器:即指Spring IOC容器,BeanFactory是容器的實際代表者,他負責bean物件的建立,配置和容納建立的bean描述並且管理bean;Spring為我們提供了許多易用的BeanFactory實現, XmlBeanFactory就是最常用的一個。該實現將以XML方式描述組成應用的物件以及物件間的依賴關係。XmlBeanFactory類將獲取此XML配置元資料,並用它來構建一個完全可配置的系統或應用。
所以控制反轉IoC(Inversion of Control)是說建立物件的控制權進行轉移,以前建立物件的主動權和建立時機是由自己把控的,而現在這種權力轉移到第三方,比如轉移交給了IoC容器,它就是一個專門用來建立物件的工廠,你要什麼物件,它就給你什麼物件,有了 IoC容器,依賴關係就變了,原先的依賴關係就沒了,它們都依賴IoC容器了,通過IoC容器來建立它們之間的關係。
Spring IOC 容器
元資料:我們通常配置的Spring配置xml檔案內容,就是元資料;
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<bean id="..." class="...">
<!-- collaborators and configuration for this bean go here -->
</bean>
<!-- more bean definitions go here -->
</beans>
注入依賴:
依賴注入(DI)背後的基本原理是物件之間的依賴關係(即一起工作的其它物件)只會通過以下幾種方式來實現:構造器的引數、工廠方法的引數,或給由建構函式或者工廠方法建立的物件設定屬性。因此,容器的工作就是建立bean時注入那些依賴關係。相對於由bean自己來控制其例項化、直接在構造器中指定依賴關係或者類似服務定位器(Service Locator)模式這3種自主控制依賴關係注入的方法來說,控制從根本上發生了倒轉,這也正是控制反轉(Inversion of Control, IoC) 名字的由來。 Spring的IOC關鍵配置 1.如何定義(建立)一個bean
Spring IoC容器將管理一個或多個bean,這些bean 將通過配置檔案中的bean定義被建立(在XML格式中為<bean/> 元素)。
在容器內部,這些bean定義由BeanDefinition 物件來表示,該定義將包含以下資訊:
全限定類名:這通常就是已定義bean的實際實現類。
bean行為的定義,這些定義將決定bean在容器中的行為(作用域、生命週期回撥等等)
對其他bean的引用,這些引用bean也可以稱之為協作bean(collaborators) 或依賴bean(dependencies).
建立bean例項時的其他配置設定。比如使用bean來定義連線池,可以通過屬性或者構 造引數指定連線數,以及連線池大小限制等。
2.bean如何例項化
從本質上來說,bean定義描述瞭如何建立一個或多個物件例項。當需要的時候, 容器會從bean定義列表中取得一個指定的bean定義,並根據bean定義裡面的配置元資料 使用反射機制來建立(或取得)一個實際的物件。
當採用XML描述配置元資料時,將通過<bean/>元素的 class屬性來指定例項化物件的型別。class 屬性 (對應BeanDefinition例項的 Class屬性)通常是必須的(不過也有兩種例外的情形,見 Section 3.2.3.2.3, “使用例項工廠方法例項化”和 Section 3.6, “bean定義的繼承”)。class屬性主要有兩種用途 :在大多數情況下,容器將直接通過反射呼叫指定類的構造器來建立bean(這有點類似於 在Java程式碼中使用new操作符);在極少數情況下,容器將呼叫 類的靜態工廠方法來建立bean例項,class 屬性將用來指定實際具有靜態工廠方法的類(至於呼叫靜態工廠 方法建立的物件型別是當前class還是其他的class則無關緊要)。 例項化主要有三種方式:用構造器來例項化,使用靜態方法例項化,使用例項工廠來例項化;
- DI-注入依賴(指的就是物件與物件之間的依賴關係通過配置的方式建立) 通過以下幾種方式來實現:構造器的引數、工廠方法的引數,或給由建構函式或者工廠方法建立的物件設定屬性。DI主要有兩種注入方式,即 Setter注入和 構造器注入;
String AOP
理解”面向切面程式設計”
面向切面程式設計是軟體程式設計思想發展到一定階段的產物是對面向物件程式設計的有益補充.AOP一般適用於具有橫切邏輯的場合,如訪問控制.事務管理.效能檢測等。在業務系統中,總有一些散落.滲透到系統各處且不得不處理的事情,這些穿插在既定業務中的操作就是所謂的橫切邏輯也稱為切面。面向切面程式設計,簡單的說就是在不改變原程式的基礎上為程式碼段增加新的功能,對程式碼段進行增強處理。
AOP(Aspect Oriented Programming),即面向切面程式設計,可以說是OOP(Object Oriented Programming,面向物件程式設計)的補充和完善。OOP引入封裝、繼承、多型等概念來建立一種物件層次結構,用於模擬公共行為的一個集合。不過OOP允許開發者定義縱向的關係,但並不適合定義橫向的關係,例如日誌功能。日誌程式碼往往橫向地散佈在所有物件層次中,而與它對應的物件的核心功能毫無關係對於其他型別的程式碼,如安全性、異常處理和透明的持續性也都是如此,這種散佈在各處的無關的程式碼被稱為橫切(cross cutting),在OOP設計中,它導致了大量程式碼的重複,而不利於各個模組的重用。
AOP技術恰恰相反,它利用一種稱為"橫切"的技術,剖解開封裝的物件內部,並將那些影響了多個類的公共行為封裝到一個可重用模組,並將其命名為"Aspect",即切面。所謂"切面",簡單說就是那些與業務無關,卻為業務模組所共同呼叫的邏輯或責任封裝起來,便於減少系統的重複程式碼,降低模組之間的耦合度,並有利於未來的可操作性和可維護性
AOP核心概念
●橫切關注點
對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之為橫切關注點
●切面(aspect)
一個模組化的橫切邏輯(或稱橫切關注點)可能會橫切多個物件。類是對物體特徵的抽象,切面就是對橫切關注點的抽象
●連線點(joinpoint)
被攔截到的點,因為Spring只支援方法型別的連線點,所以在Spring中連線點指的就是被攔截到的方法,實際上連線點還可以是欄位或者構造器
●切入點(pointcut)
對連線點的特徵進行描述,可以使用正則表示式,增強處理和一個切入點表示式相關聯,並在與這個切入點匹配的某個連線點上執行。
●通知(advice)
所謂通知指的就是指攔截到連線點之後要執行的程式碼,通知分為前置、後置、異常、最終、環繞通知五類
●目標物件
被一個或多個切面增強的物件,由AOP框架所建立的物件,實現執行增強處理方法等功能
●織入(weave)
將增強處理連線到應用程式中的型別或物件上的過程
●引入(introduction)
在不修改程式碼的前提下,引入可以在執行期為類動態地新增一些方法或欄位
【說明】切面可以理解為由增強處理和切入點組成,即包含了橫切邏輯的定義,面向切面程式設計主要關心兩個問題,即在什麼位置,執行什麼功能。Spring AOP是負責實施切面的框架,即由SpringAop完成織入工作,advice直譯為通知,但是這種叫法並不明確,在此處翻譯為:增強處理,更便於理解
使用Spring AOP實現日誌輸出
準備兩個jar包:
1、aopalliance.jar
2、aspectjweaver.jar
配置檔案中
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.2.xsd">
<bean id="helloWorldImpl1" class="com.xrq.aop.HelloWorldImpl1" />
<bean id="helloWorldImpl2" class="com.xrq.aop.HelloWorldImpl2" />
<bean id="timeHandler" class="com.xrq.aop.TimeHandler" />
<aop:config>
<aop:aspect id="time" ref="timeHandler">
<aop:pointcut id="addAllMethod" expression="execution(* com.xrq.aop.HelloWorld.*(..))" />
<aop:before method="printTime" pointcut-ref="addAllMethod" />
<aop:after method="printTime" pointcut-ref="addAllMethod" />
</aop:aspect>
</aop:config></beans>
Execution 是切入點指示符,他的括號是一個切入點表示式,可以配置需要切入增強處理的方法特徵,切入點表示式支援模糊匹配,下面講解幾種常用的模糊匹配
- Public * addNewUser(entity.User);”*”表示匹配所以型別的返回值。
- Public void addNewUser(..);”..”表示匹配所有引數個數和型別
- * com.service.*.*(..);這個表示式匹配com.service包下所有類的所有方法
- *com.service..*.*(..);這個表示式匹配com.service包及其子包下所有類的所有方法
本章總結
- Spring是一個輕量級的企業級框架,提供了Ioc容器,AOP實現.DAO/ROM支援.web整合等功能,目標是使現有的java EE 技術更易用,並促進良好的編碼習慣
- 依賴注入讓元件之間以配置檔案的形式組織在一起,而不是以硬編碼的方式耦合在一起.
- Spring配置檔案按是完成組裝的主要場所,常用節點包括<bean>及其子節點<property>
- AOP的目的是從系統中分離出切面,獨立於業務邏輯實現,在程式執行時織入程式中執行
- 面向切面程式設計主要關心兩個問題:在什麼位置,執行什麼功能
- 配置AOP主要使用aop名稱空間下的元素完成,可以實現定義切入點和織入增強等操作
內容就到這,
我是印書打總結的陳恰恰.77