工具北京動力節點spring4講義_第1頁
工具北京動力節點spring4講義_第2頁
工具北京動力節點spring4講義_第3頁
工具北京動力節點spring4講義_第4頁
工具北京動力節點spring4講義_第5頁
已閱讀5頁,還剩60頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Java 框架 Spring4Spring4 框架技術講義第1章 Spring 概述1.1 為什么使用 Spring?Spring 是一個框架,是一個半成品的軟件。有 20 個模塊組成。它是一個容器管理對象,對象之間的依賴關系。(1) 輕量Spring 框架使用的 jar 都比較小,一般在 1M 以下或者幾百 kb。Spring的 jar 總共在 3M 左右。功能的所需Spring 框架運行占用的少,運行效率高。不依賴其他 jar(2)接口編程,解耦合Spring 提供了 Ioc反轉,由容器管理對象,對象的依賴關系。原來在程序代碼中的對象創建方式,現在由容器完成。對象之間的依賴解耦合。(3)

2、AOP 編程的支持通過 Spring 提供的 AOP 功能,方便進行面向切面的編程,許多不容易用傳統 OOP 實現的功能可以通過AOP 輕松應付在 Spring 中,開發可以從繁雜的事務管理代碼中解脫出來,通過式方式靈活地進行事務的管理,提高開發效率和質量。(4) 方便集成各種優秀框架Spring 不排斥各種優秀的開源框架,相反 Spring 可以降低各種框架的使用難度,Spring 提供了對各種優秀框架(如 Struts,Hibernate、MyBatis)等的直接支持。簡化框架的使用。(5) 非侵入式所謂非侵入式是指,Spring 框架的在業務邏輯上出現,由于業務邏輯中沒有API北京動力節

3、點講師 王鶴1Java 框架 Spring4Spring 的 API,所以業務邏輯可以從 Spring 框架快速的移植到其他框架,即與環境無關。(6) 容器Spring 作為一個容器,可以管理對象的生命周期、對象與對象之間的依賴關系。可以通過配置文件,來定義對象,以及設置與其他對象的依賴關系。1.2Spring 框架是什么(掌握)Spring 的主要作用就是為代碼“解耦”,降低代碼間的耦合度。就是讓對象和對象(模塊和模塊)之間關系不是使用代碼關聯,而是通過配置來說明。即在 Spring 中說明對象(模塊)的關系。Spring 根據代碼的功能特點,使用 Ioc 降低業務對象之間耦合度。IoC 使

4、得主業務在相互調用過程中,不用再自己維護關系了,即不用再自己創建要使用的對象了。而是由 Spring 容器統一管理,自動“注入”,注入即賦值。 而 AOP 使得系統級服務得到了最大復用,且不用再由程序員手工將系統級服務“混雜”到主業務邏輯中了,而是由 Spring 容器統一完成“織入”。北京動力節點講師 王鶴2Spring 是于 2003 年興起的一個輕量級的Java 開發框架,它是為了解決企業應用開發的復雜性而創建的。Spring 的 是 反轉(IoC)和面向切面編程(AOP)。簡單來說, Spring 是一個分層的 Java SE/EE 輕量級開源框架 。Java 框架 Spring41.

5、3Spring 體系結構(了解)Spring 由 20 多個模塊組成,它們可以分為數據/集成(Data Access/Integration)、Web、面向切面編程(AOP, Aspects)、應用服務器設備管理(Instrumentation)、消息(Messaging)、容器(Core Container)和測試(Test)。1.4 Spring 的(了解)Spring 官網:北京動力節點講師 王鶴3Java 框架 Spring4地址:點擊后,搜索”zip”關鍵字。選擇版本4.3.9 版本北京動力節點講師 王鶴4Java 框架 Spring41.5 Spring4 框架解壓目錄及 Jar

6、包說明(了解)libs 目錄內容說明:北京動力節點講師王鶴5Java 框架 Spring4第2章 IoC反轉反轉(IoC,Inversion of Control),是一個概念,是一種思想。指將傳統上由程序代碼直接操控的對象調用權交給容器,通過容器來實現對象的裝配和管理。反轉就是對對象權的轉移,從程序代碼本身反轉到了外部容器。通過容器實現對象的裝配和管理。IoC 是一個概念,是一種思想,其實現方式多種多樣。當前比較流行的實現方式是依賴注入。應用廣泛。依賴:classA 類中含有 classB 的實例,在 classA 中調用 classB 的方法完對 classB 有依賴。Ioc 的實現:能,

7、即 classAØØ依賴查找:DL ( Dependency Lookup ), 容器提供回調接口和上下文環境給組件。依賴注入:DI (Dependency Injection),程序代碼不做行完成。,這些工作由容器自依賴注入 DI 是指程序運行過程中,若需要調用另一個對象協助時,無須在代碼中創建被調用者,而是依賴于外部容器,由外部容器創建后傳遞給程序。Spring 的依賴注入對調用者與被調用者幾乎沒有任何要求,完全支持 POJO 之間依賴關系的管理。依賴注入是目前最優秀的解耦方式。依賴注入讓 Spring 的 Bean 之間以配置文件的方式組織在一起,而不是以硬編碼的方式

8、耦合在一起的。2.1 Spring 的第一個程序(掌握)在普通三層架構的基礎上,將程序修改為 Spring 框架程序舉例:01-primay2.1.1導入Jar 包首先,導入 Spring 程序開發的四個基本 jar 包。北京動力節點講師王鶴Java 框架 Spring4日志:其次,導入日志相關的 Jar 包。commons.logging.jar 該文件只是日志并沒有具體的實現(相當于日志操作的接口定義)。這里日志的實現使用 log4j,故還需要 log4j.jar。最后,導入 JUnit 測試 Jar 包 junit-4.9.jar。Spring 基本編程,共需 7 個 Jar 包即可。的

9、實現規范,2.1.2定義接口與實體類北京動力節點講師 王鶴Java 框架 Spring42.1.3創建 Spring 配置文件Spring 配置文件的文件名可以隨意,但 Spring 建議的名稱為 applicationContext.xml。文件約束在%SPRING_HOME%docsspring-framework-referencehtmlxsd-configuration.html件中。文注意,Spring 配置文件中使用的約束文件為 xsd 文件。若 Eclipse 中沒有自動提示功能,則需要將約束要查找的地址指向本地的 xsd 文件。相應的 xsd 文件在 Spring 框架解壓目

10、錄下的 schema 目錄的相應子目錄中。約束文件:xsd(xml schema definition)xml 文檔結構定義。作用:驗證 xml 文檔的邏輯結構是否正確。1. 定義一個 xml 文檔中都有什么元素2. 定義一個 xml 文檔中都有什么屬性3. 定義一個 xml 文檔中元素可以有哪些子元素,以及元素的順序。4. 定義一個 xml 文檔中元素和屬性的數據類型。這里需要的是 spring-beans.xsd 約束文件,故需要在 beans 子目錄中查找相應版本的約束文件。北京動力節點講師 王鶴Java 框架 Spring4<bean />:用于定義一個實例對象。一個實例對

11、應一個 bean 元素。id:該屬性是 Bean 實例的唯一標識,程序通過 id 屬性賴關系也是通過 id 屬性關聯的。Bean,Bean 與 Bean 間的依class:指定該 Bean 所屬的類,注意這里只能是類,不能是接口。2.1.4配置不能聯網,本機的約束文件先拷貝約束文件的url 地址, 然后點擊 Eclipse 的 windows 菜單下面的 Perferences北京動力節點講師 王鶴Java 框架 Spring42.1.5定義測試類北京動力節點講師 王鶴Java 框架 Spring42.1.6容器接口和實現類(1) ApplicationContext 接口(容器)Applic

12、ationContext 用于加載 Spring 的配置文件,在程序中充當“容器”的類有兩個。通過 Ctrl +T 查看:。其實現A、 配置文件在類路徑下若 Spring 配置文件存放在項目的類路徑下,則使用 ClassPathXmlApplicationContext 實現類進行加載。B、 配置文件在本地目錄中若 Spring 配置文件存放在本地磁盤目錄中,則使用 FileSystemXmlApplicationContext 實現類進行加載。北京動力節點講師 王鶴Java 框架 Spring4C、 配置文件在項目根路徑下若 Spring 配置文件存放在項目的根路徑下,同樣使用 FileSy

13、stemXmlApplicationContext實現類進行加載。下面是存放在項目根路徑下的情況,該配置文件與 src 目錄同級,而非在 src 中。D、ApplicationContext 容器中對象的裝配時機ApplicationContext 容器,會在容器對象初始化時,將其中的所有對象全部裝配好。以后代碼中若要使用到這些對象,只需從內存中直接獲取即可。執行效率較高。但占用內存。北京動力節點講師 王鶴Java 框架 Spring42.2 Bean 的裝配舉例:beanAssemble 項目Bean 的裝配,即 Bean 對象的創建。容器根據代碼要求創建 Bean 對象后再傳遞給代碼的過程

14、,稱為Bean 的裝配。2.2.1默認裝配方式(掌握)代碼通過 getBean()方式從容器獲取指定的 Bean 實例,容器首先會調用 Bean 類的無參構造器,創建空值的實例對象。舉例:北京動力節點講師 王鶴Java 框架 Spring42.2.2容器中 Bean 的作用域(掌握)當通過 Spring 容器創建一個 Bean 實例時,不僅可以完成 Bean 的實例化,還可以通過scope 屬性,為 Bean 指定特定的作用域。Spring 支持 5 種作用域。(1) singleton:單態模式。即在整個 Spring 容器中,使用 singleton 定義的Bean 將是單例的,只有一個實

15、例。默認為單態的。(2) prototype:原型模式。即每次使用 getBean 方法獲取的同一個<bean />的實例都是一個新的實例。(3) request:對于每次HTTP 請求,都將會產生一個不同的 Bean 實例。(4) session:對于每個不同的 HTTP session,都將產生一個不同的 Bean 實例。注意:(1) 對于 scope 的值request、session 只有在 Web 應用中使用 Spring 時,該作用域才有效。(2) 對于 scope 為 singleton 的單例模式,該 Bean 是在容器被創建時即被裝配好了。(3) 對于 scope

16、 為 prototype 的原型模式,Bean 實例是在代碼中使用該 Bean 實例時才進行裝配的。舉例:北京動力節點講師 王鶴Java 框架 Spring42.2.3定制Bean 的生命始末(掌握)可以為 Bean 定制初始化后的生命行為,也可以為 Bean 定制銷毀前的生命行為。舉例:首先,這些方法需要在 Bean 類中事先定義好:是方法名隨意的 public void 方法。其次,在配置文件的<bean/>中增加如下屬性:init-method:指定初始化方法的方法名destroy-method:指定銷毀方法的方法名北京動力節點講師 王鶴Java 框架 Spring4注意,若

17、要看到 Bean 的 destroy-method 的執行結果,需要滿足兩個條件:(1) Bean 為 singleton,即單例(2) 要確保容器關閉。接口 ApplicationContext 沒有close()方法,但其實現類有。所以,可以將 ApplicationContext 強轉為其實現類對象,或直接創建的就是實現類對象。2.3 基于 XML 的 DI舉例:項目 di-xml2.3.1注入分類bean 實例在調用無參構造器創建了空值對象后,就要對 bean 對象的屬性進行初始化。初始化是由容器自動完成的,稱為注入。根據注入方式的不同,常用的有兩類:設值注入、構造注入。(1) 設值注

18、入(掌握)設值注入是指,通過 setter 方法傳入被調用者的實例。這種注入方式簡單、直觀,因而在 Spring 的依賴注入中大量使用。舉例:北京動力節點講師 王鶴Java 框架 Spring4當指定 bean 的某屬性值為另一 bean 的實例時,通過 ref 指定它們間的的值必須為某bean 的 id 值。關系。ref對于其它 Bean 對象的,除了<bean/>的 ref 屬性外,還可以使用<ref/>。(2) 構造注入(理解)構造注入是指,在構造調用者實例的同時,完成被調用者的實例化。即,使用構造器設北京動力節點講師 王鶴Java 框架 Spring4置依賴關系

19、。舉例:<constructor-arg />中用于指定參數的屬性有:name:指定參數名稱。index:指明該參數對應著構造器的第幾個參數,從 0 開始。不過,該屬性不要也行,ØØ但要注意,若參數類型相同,或之間有包含關系,則需要保證賦值順序要與構造器中的參數順序一致。2.3.2具有集合性質的屬性注入(掌握)舉例:di03 包北京動力節點講師 王鶴Java 框架 Spring4(1)為數組注入值(2)為 List 注入值(3)為 Set 注入值(4)為 Map 注入值北京動力節點講師 王鶴Java 框架 Spring4(5) 為 Properties 注入值(

20、6) 復雜集合屬性的注入MyCollections 類中增加新的屬性在容器配置文件注入方式:2.3.3對于類型屬性的自動注入對于類型屬性的注入,也可不在配置文件中顯示的注入。可以通過為<bean/>設置 autowire 屬性值,為類型屬性進行隱式自動注入(默認是不自動注入類型屬性)。根據自動注入標準的不同,可以分為兩種:byName:根據名稱自動注入byType:根據類型自動注入北京動力節點講師 王鶴Java 框架 Spring4(1) byName 方式自動注入(理解)當配置文件中被調用者 bean 的 id 值與代碼中調用者 bean 類的屬性名相同時,可使用byName 方

21、式,讓容器自動將被調用者 bean 注入給調用者 bean。容器是通過調用者的 bean 類的屬性名與配置文件的被調用者 bean 的 id 進行比較而實現自動注入的。舉例:(2) byType 方式自動注入(理解)使用 byType 方式自動注入,要求:配置文件中被調用者 bean 的 class 屬性指定的類,要與代碼中調用者 bean 類的某類型屬性類型同源。即要么相同,要么有 is-a 關系(子類,或是實現類)。但這樣的同源的被調用 bean 只能有一個。多于一個,容器就不知該匹配哪一個了。舉例:北京動力節點講師 王鶴Java 框架 Spring42.3.4為應用指定多個 Spring

22、 配置文件(掌握)在實際應用里,隨著應用規模的增加,系統中 Bean 數量也大量增加,導致配置文件變得非常龐大、臃腫。為了避免這種情況的產生,提高配置文件的可讀性與可維護性,可以將Spring 配置文件分解成多個配置文件。(1) 平等關系的配置文件(掌握)將配置文件分解為地位平等的多個配置文件,并將所有配置文件的路徑定義為一個String 數組,將其作為容器初始化參數出現。其將與可變參的容器構造器匹配。各配置文件間為并列關系,不分主次。舉例:北京動力節點講師 王鶴Java 框架 Spring4(2) 包含關系的配置文件(掌握)各配置文件中有一個總文件,總配置文件將各其它子文件通過<imp

23、ort/>引入。在代碼中只需要使用總配置文件對容器進行初始化即可。舉例:Java北京動力節點講師 王鶴Java 框架 Spring4也可使用通配符*。但,此時要求父配置文件名不能滿足*所能匹配的格式,否則將出現循環遞歸包含。就本例而言,父配置文件不能匹配spring-total.xml。spring-*.xml 的格式,即不能起名為2.4 基于注解的 DI舉例:di-annotation 項目對于 DI 使用注解,將不再需要在 Spring 配置文件中bean 實例。Spring 中使用注解,需要在原有Spring 運行環境基礎上再做一些改變,完成以下三個步驟。(1)導入 AOP 的 J

24、ar 包。因為注解的實現用到了 AOP 編程。(2)需要更換配置文件頭,即添加相應的約束。約束在 %SPRING_HOME%docsspring-framework-referencehtmlxsd-configuration.html 文件中。北京動力節點講師 王鶴Java 框架 Spring4(3)需要在 Spring 配置文件中配置組件掃描器,用于在指定的基本包中掃描注解。3-1)使用多個 context:component-scan 指定不同的包路徑3-2)指定 base-package 的值使用分隔符分隔符可以使用逗號(,)分號(;)還可以使用空格,不建議使用空格。逗號分隔:分號分隔

25、:3-3)base-package 是指定到父包名base-package 的值表是基本包,容器啟動會掃描包及其子包中的注解,當然也會掃描到子包下級的子包。所以 base-package 可以指定一個父包就可以。或者最頂級的父包北京動力節點講師 王鶴Java 框架 Spring4但不建議使用頂級的父包,掃描的路徑比較多,導致容器啟動時間變慢。指定到目標包和合適的。也就是注解所在包全路徑。例如注解的類在 com.bjpowernode.beans 包中2.4.1定義Bean 的注解Component(掌握)需要在類上使用注解Component,該注解的 value 屬性用于指定該 bean 的

26、id 值。舉例:di01另外,Spring 還提供了 3 個功能基本和Component 等效的注解:ØØØ用于對DAO 實現類進行注解用于對 Service 實現類進行注解用于對 Controller 實現類進行注解RepositoryService Controller之所以創建這三個功能與Component 等效的注解,是為了以后對其進行功能上的擴展。Component 不指定 value 屬性,bean 的 id 是類名的首字母小寫。2.4.2簡單類型屬性注入Value(掌握)需要在屬性上使用注解Value,該注解的 value 屬性用于指定要注入的值。使

27、用該注解完成屬性注入時,類中無需 setter。當然,若屬性有 setter,則也可將其加到 setter 上。舉例:北京動力節點講師 王鶴Java 框架 Spring42.4.3byType 自動注入Autowired(掌握)需要在屬性上使用注解Autowired,該注解默認使用按類型自動裝配 Bean 的方式。使用該注解完成屬性注入時,類中無需 setter。當然,若屬性有 setter,則也可將其加到 setter 上。舉例:2.4.4byName 自動注入Autowired 與Qualifier(掌握)需要在屬性上使用注解Autowired 與Qualifier。Qualifier 的

28、 value 屬性用于指定要匹配的Bean 的 id 值。同樣類中無需setter,也可加到 setter 上。舉例:北京動力節點講師 王鶴Java 框架 Spring4Autowired 還有一個屬性required,默認值為 true,表示當匹配失敗后,會終止程序運行。若將其值設置為 false,則匹配失敗,將被忽略,未匹配的屬性值為 null。2.4.5JDK 注解Resource 自動注入 (掌握)Spring 提供了對jdk 中Resource 注解的支持。Resource 注解既可以按名稱匹配Bean, 也可以按類型匹配Bean。默認是按名稱注入。使用該注解,要求 JDK 必須是

29、6 及以上版本。Resource 可在屬性上,也可在 set 方法上。(1) byType 注入類型屬性Resource 注解若不帶任何參數,采用默認按名稱的方式注入,按名稱不能注入 bean, 則會按照類型進行Bean 的匹配注入。舉例:(2) byName 注入類型屬性Resource 注解指定其 name 屬性,則 name 的值即為按照名稱進行匹配的 Bean 的 id。北京動力節點講師 王鶴Java 框架 Spring4舉例:2.4.6Bean 的生命始末PostConstruct 與PreDestroy(掌握)在方法上使用PostConstruct 與原來的 init-method

30、 等效。在方法上使用PreDestroy, 與 destroy-method 等效。舉例:2.4.7注解與 XML 的對比注解的好處是,配置方便,直觀。但其弊端也顯而易見:以硬編碼的方式寫入到了 Java代碼中,其修改是需要重新編譯代碼的。XML 配置方式的最大好處是,對其所做修改,無需編譯代碼,只需重啟服務器即可將新的配置加載。注解的特點是高效(代碼少,沒有配置文件的書寫那么復雜),XML 配置方式的特點是靈活(無需修改源代碼),再有如果要使用的類不是自己編寫的,沒有源代碼。那也使用不了Compoent 等注解, 此時使用XML 進行配置 bean。北京動力節點講師 王鶴Java 框架 Sp

31、ring4第3章 AOP 面向切面編程3.1 動態動態作用:功能增強和JDK 動態(理解)3.1.1動態對象只是由生成的。是指,程序在整個運行過程中根本就不存在目標類的類,目標對象的生成工具(不是真實定義的類)在程序運行時由 JVM 根據反射等機制動態對象與目標對象的關系在程序運行時才確立。對比靜態,靜態是指在程序運行前就已經定義好了目標類的類。類與目標類的關系在程序運行之前就確立了。動態的實現方式常用的有兩種:使用 JDK 的 Proxy,與通過 CGLIB 生成。Jdk 的動態要求目標對象必須實現接口,這是 java 設計上的要求。從 jdk1.3 以來,java 語言通過 java.la

32、ng.reflect 包提供三個類支持和 InovcationHandler。模式 Proxy, MethodA、 通過 JDK 的 java.lang.reflect.Proxy 類實現動態,會使用其靜態方法newProxyInstance(),依據目標對象、業務接口及調用處理器三者,自動生成一個動態對象。B、 InvocationHandler 是個接口,其具體介紹如下:實現了 InvocationHandler 接口的類用于加強目標類的主業務邏輯。這個接口中有一個方法 invoke(),具體加強的代碼邏輯就是定義在該方法中的。程序調用主業務邏輯時,會自動調用 invoke()方法。/Ob

33、ject proxy:對象/Method m :調用的方法/Object args: 調用方法的參數public Object invoke(Object proxy, Method m, Object args) 北京動力節點講師 王鶴Java 框架 Spring4C、 Method 類對象,該類有一個方法也叫 invoke(),可以調用目標類的目標方法。這兩個 invoke()方法,雖然同名,但無關。public Object invoke ( Object obj, Object. args)obj:表示目標對象args:表示目標方法參數,就是其上一層 invoke 方法的第三個參數3.

34、1.2CGLIB 動態(理解)CGLIB(Code Generation Library)是一個開源項目。是一個強大的,高性能,高質量的Code生成類庫,它可以在運行期擴展使用,例如 Spring AOP。使用 JDK 的 Proxy 實現Java 類與實現 Java 接口。它廣泛的被許多 AOP 的框架,要求目標類與類實現相同的接口。若目標類不存在接口,則無法使用該方式實現。但對于無接口的類,要為其創建動態來實現。,就要使用 CGLIB的生成原理是生成目標類的子類,而子類是增強過的,這個子類對象就是代CGLIB理對象。所以,使用 CGLIB 生成動態類。CGLIB 經常被應用在框架中,例如,

35、要求目標類必須能夠被繼承,即不能是 final 的Spring ,Hibernate 等。cglib 的效率高于 Jdk。項目中直接使用動態的地方不多。一般都使用框架提供的功能。(1) 導入 jar北京動力節點講師 王鶴Java 框架 Spring4(2) 定義目標類SomeSerivce.java ,有 String doSome()方法(3)定義調用處理器,實現 MethodInterceptor 接口(4)定義工廠類,創建對象北京動力節點講師 王鶴Java 框架 Spring4(5) 定義客戶端類3.2 AOP 引入(理解)Step1:項目 aop_leadin1先定義好接口與一個實現類

36、,該實現類中除了要實現接口中的方法外,還要再寫兩個非業務方法。非業務方法也稱為交叉業務邏輯:ØØdoTransaction():用于事務處理doLog():用于日志處理然后,再使接口方法調用它們。接口方法也稱為主業務邏輯。北京動力節點講師 王鶴Java 框架 Spring4Step2:項目 aop_leadin2當然,也可以有另一種解決方案:將這些交叉業務邏輯代碼放到專門的工具類或處理類中,由主業務邏輯調用。Step3:項目 aop_leadin3以上的解決方案,還是存在弊端:交叉業務與主業務深度耦合在一起。當交叉業務邏輯較多時,在主業務代碼中會出現大量的交叉業務邏輯代碼調

37、用語句,大大影響了主業務邏輯的可讀性,降低了代碼的可維護性,同時也增加了開發難度。所以,可以采用動態方式。在不修改主業務邏輯的前提下,擴展和增強其功能。北京動力節點講師 王鶴Java 框架 Spring43.3 AOP 概述(理解)3.4 AOP 簡介AOP(Aspect Orient Programming),面向切面編程,是面向對象編程 OOP 的一種補充。面向對象編程是從靜態角度考慮程序的結構,而面向切面編程是從動態角度考慮程序運行過程。AOP 底層,就是采用動態模式實現的。采用了兩種:JDK 的動態,與 CGLIB的動態。北京動力節點講師 王鶴Java 框架 Spring4面向切面編程

38、,就是將交叉業務邏輯封裝成切面,利用 AOP 容器的功能將切面織入到主業務邏輯中。所謂交叉業務邏輯是指,通用的、與主業務邏輯無關的代碼,如安全檢查、事務、日志、緩存等。若不使用 AOP,則會出現代碼糾纏,即交叉業務邏輯與主業務邏輯混合在一起。這樣,會使主業務邏輯變的混雜不清。例如,轉賬,在真正轉賬業務邏輯前后,需限、日志、加載事務、結束事務等交叉業務邏輯,而這些業務邏輯與主業務邏輯間并無直接關系。但,它們的代碼量所占比重能達到總代碼量的一半甚至還多。它們的存在,不僅產生了大量的“冗余”代碼,還大大干擾了主業務邏輯-轉賬。AOP 編程術語(掌握)(1) 切面(Aspect)切面泛指交叉業務邏輯。

39、上例中的事務處理、日志處理就可以理解為切面。常用的切面是通知(Advice)。實際就是對主業務邏輯的一種增強。(2) 織入(Weaving)織入是指將切面代碼到目標對象的過程。上例中MyInvocationHandler 類中的invoke()方法完成的工作,就可以稱為織入。(3) 連接點(JoinPoint)連接點指可以被切面織入的具體方法。通常業務接口中的方法均為連接點。(4) 切入點(Pointcut)切入點指的一個或多個連接點的集合。通過切入點指定一組方法。被標記為 final 的方法是不能作為連接點與切入點的。因為最終的是不能被修改的,不能被增強的。北京動力節點講師 王鶴Java 框

40、架 Spring4(5) 目標對象(Target)目標對象指將要被增強的對象。 即包含主業務邏輯的類的對象。 上例中的StudentServiceImpl 的對象若被增強,則該類稱為目標類,該類對象稱為目標對象。當然, 不被增強,也就無所謂目標不目標了。(6) 通知(Advice)通知是切面的一種實現,可以完成簡單織入功能(織入功能就是在這里完成的)。上例中的 MyInvocationHandler 就可以理解為是一種通知。換個角度來說,通知定義了增強代碼切入到目標代碼的時間點,是目標方法執行之前執行,還是之后執行等。通知類型不同,切入時間不同。切入點定義切入的位置,通知定義切入的時間。3.5

41、 AspectJ 對 AOP 的實現(掌握)對于 AOP 這種編程思想,很多框架都進行了實現。Spring 就是其中之一,可以完成面向切面編程。然而,AspectJ 也實現了 AOP 的功能,且其實現方式更為簡捷,使用更為方便, 而且還支持注解式開發。所以,Spring 又將 AspectJ 的對于 AOP 的實現也引入到了自己的框架中。在 Spring 中使用AOP 開發時,一般使用AspectJ 的實現方式。3.5.1AspectJ 簡介官網地址:AspetJ 是 Eclipse 的開源項目,官網介紹如下:a seamless aspect-oriented extension to th

42、e Javatm programming language(一種基于 Java 平臺北京動力節點講師 王鶴Java 框架 Spring4的面向切面編程的語言)Java platform compatible(兼容 Java 平臺,可以無縫擴展)easy to learn and use(易學易用)類型(理解)3.5.2AspectJAspectJ 中常用(1) 前置通知(2) 后置通知(3) 環繞通知(4) 異常通知(5) 最終通知有五種類型:3.5.3AspectJ 的切入點表達式(掌握)AspectJ 定義了專門的表達式用于指定切入點。表達式的原型是:權限類型execution ( mod

43、ifiers-patternret-type-pattern 返回值類型declaring-type-pattern全限定性類名name-pattern(param-pattern)方法名(參數名) throws-pattern拋出異常類型)切入點表達式要匹配的對象就是目標方法的方法名。所以,execution表達式中明顯就是方法的簽名。注意,表達式中加 的部分表示可省略部分,各部分間用空格可以使用以下符號:。在其中舉例:execution(public * *(.)指定切入點為:任意公共方法。execution(* set*(.)指定切入點為:任何一個以“set”開始的方法。executio

44、n(* com.xyz.service.*.*(.)指定切入點為:定義在 service 包里的任意類的任意方法。execution(* com.xyz.service.*.*(.)指定切入點為:定義在 service 包或者子包里的任意類的任意方法。“.”出現在類名中時,后面必須跟“*”,表示execution(* *.service.*.*(.)包下的所有類。北京動力節點講師 王鶴Java 框架 Spring4指定只有一級包下的 serivce 子包下所有類(接口)中所有方法為切入點execution(* *.service.*.*(.)指定所有包下的serivce 子包下所有類(接口)中

45、所有方法為切入點execution(* *.ISomeService.*(.)指定只有一級包下的 ISomeSerivce 接口中所有方法為切入點execution(* *.ISomeService.*(.)指定所有包下的ISomeSerivce 接口中所有方法為切入點execution(* com.xyz.service.IAccountService.*(.)指定切入點為:IAccountService 接口中的任意方法。execution(* com.xyz.service.IAccountService+.*(.)指定切入點為:IAccountService 若為接口,則為接口中的任意

46、方法及其所有實現類中的任意方法;若為類,則為該類及其子類中的任意方法。execution(* joke(String,int)指定切入點為:所有的 joke(String,int)方法,且 joke()方法的第一個參數是 String,第二個參數是 int。如果方法中的參數類型是 java.lang 包下的類,可以直接使用類名,否則必須使用全限定類名,如 joke( java.util.List, int)。execution(* joke(String,*)指定切入點為:所有的 joke()方法,該方法第一個參數為 String,第二個參數可以是任意類型,如joke(String s1,St

47、ring s2)和joke(String s1,double d2)都是,但joke(String s1,double d2,String s3)不是。execution(* joke(String,.)指定切入點為:所有的 joke()方法,該方法第一個參數為 String,后面可以有任意個參數且參數類型不限,如 joke(String s1)、joke(String s1,String s2)和 joke(String s1,double d2,String s3) 都是。execution(* joke(Object)指定切入點為:所有的 joke()方法,方法擁有一個參數,且參數是 O

48、bject 類型。joke(Object ob)是,但,joke(String s)與 joke(User u)均不是。execution(* joke(Object+)指定切入點為:所有的 joke()方法,方法擁有一個參數,且參數是 Object 類型或該類的子類。不僅 joke(Object ob)是,joke(String s)和 joke(User u)也是。AspectJ 的開發環境(掌握)3.5.4(1)導入三個 Jar 包llspring 框架 aop 的實現 jar 包: spring-aop.jaraspectj 框架對 aop 的實現 jar 包: aspectjrt.j

49、ar , aspectjweaver.jarSpring 對 AOP 的實現包在Spring 框架的解壓包中:spring-aop-4.3.9.RELEASE.jar北京動力節點講師 王鶴Java 框架 Spring4AspectJ 自身的 Jar 包:在 AspectJ 官網:后的 aspectj-1.9.0.jar ,解壓目錄:(2) 引入AOP 約束在配置文件頭部, 要引入關于 aop的約束。在Spring 框架的解壓目錄中,docsspring-framework-referencehtml 下的 xsd-configuration.html 文件中。北京動力節點講師 王鶴Java 框

50、架 Spring4在前面 Spring 實現 AOP 時,并未引入 AOP 的約束,而在 AspectJ 實現 AOP 時,才提出要引入 AOP 的約束。說明,配置文件中使用的 AOP 約束中的而非 Spring 框架本身在實現 AOP 時使用的。,均是 AspectJ 框架使用的,AspectJ 對于 AOP 的實現有注解和配置文件兩種方式,常用是注解方式。3.5.5AspectJ 基于注解的 AOP 實現(掌握)AspectJ 提供了以注解方式對于 AOP 的實現。(1) 實現步驟A、 Step1:定義業務接口與實現類北京動力節點講師 王鶴Java 框架 Spring4B、 Step2:定

51、義切面 POJO 類該類為一個 POJO 類,將作為切面出現。其中定義了若干普通方法,將作為不同方法。C、 Step3:在切面類上添加Aspect 注解在定義的 POJO 類上添加Aspect 注解,指定當前 POJO 類將作為切面。D、Step4:在 POJO 類的普通方法上添加通知注解切面類是用于定義增強代碼的,即用于定義增強目標類中目標方法的增強方法。這些增北京動力節點講師 王鶴Java 框架 Spring4強方法使用不同”注解,會在不同的時間點完成織入。當然,對于增強代碼,還要通過execution 表達式指定具體應用的目標類與目標方法,即切入點。E、 Step5:目標對象與 POJO

52、 切面類F、 Step6:AspectJ 的自動在定義好切面 Aspect 后,需要通知 Spring 容器,讓容器生成“目標類+切面”的對象。這個自動是由容器自動生成的。只需要在 Spring 配置文件中一個基于 aspectj 的,其就會自動掃描到Aspect 注解,并按通知類型與切入點,將其織入,并生成。<aop:aspectj-autoproxy/>的底層是由 AnnotationAwareAspectJAutoProxyCreator 實現的。從其類名就可看出,是基于 AspectJ 的注解適配自動。其工作原理是,<aop:aspectj-autoproxy/>

53、;通過掃描找到Aspect 定義的切面類,再由切面類根據切入點找到目標類的目標方法,再由通知類型找到切入的時間點。北京動力節點講師 王鶴Java 框架 Spring4G、Step7:測試類中使用目標對象的 id舉例:aop_aspectj 項目的 annotation 包(2) Before 前置通知-方法有 JoinPoint 參數在目標方法執行之前執行。被注解為前置通知的方法,可以包含一個 JoinPoint 類型參數。該類型的對象本身就是切入點表達式。通過該參數,可獲取切入點表達式、方法簽名、目標對象等。不光前置通知的方法,可以包含一個 JoinPoint 類型參數,所有參數。方法均可包含該(3)AfterReturning 后置通知-注解有 returning 屬性在目標方法執行之后執行。由于是目標方法之后執行,所以可以獲取到目標方法的返回北京動力節點講師 王鶴Java 框架 Spring4值。該注解的 returning 屬性就是用于指定接收方法返回值的變量名的。所以,被注解為后置通知的方法,除了可以包含 JoinPoint 參數外,還可以包含用于接收返回值的變量。該變量最好為 Object 類型,因為目標方法的返

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論