版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第一章初識SSM框架第1章初識SSM框架.ppt第2章Spring入門.ppt第3章Spring基本用法.ppt第4章面向切面編程.ppt第5章事務管理.ppt第6章MyBatis入門.ppt第7章基于MyBatis的增刪改查操作.ppt第8章MyBatis的動態(tài)SQL語句.ppt第9章使用MyBatis動態(tài)代理技術(shù)實現(xiàn)DAO接口.ppt第10章MyBatis與Spring的整合.ppt第11章SpringWebMVC入門.ppt第12章注解式控制器開發(fā).ppt第13章數(shù)據(jù)校驗.ppt第14章攔截器.ppt第15章SpringMVC對Ajax的支持.ppt第16章文件上傳下載.ppt第17章SSM整合.ppt第18章醫(yī)療信息系統(tǒng).ppt本章目標了解SSM框架及三個框架分工了解Spring框架概念及IoC、AOP概念了解Hibernate框架概念了解MyBatis框架概念了解Hibernate框架和MyBatis框架的區(qū)別了解SpringMVC框架概念2本章教學內(nèi)容SSM框架及三個框架分工Spring框架概念及IoC、AOP概念Hibernate框架概念MyBatis框架概念Hibernate框架和MyBatis框架的區(qū)別SpringMVC框架概念3SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis兩個開源框架整合而成(SpringMVC是Spring中的部分內(nèi)容)。是目前JAVA領(lǐng)域使用非常廣泛也非常穩(wěn)定的開源Web框架。SSM框架是標準的MVC(Model-View-Controller)模式,將整個系統(tǒng)劃分為表現(xiàn)層,控制器Controller層,業(yè)務邏輯Service層,數(shù)據(jù)訪問Dao層四層。SpringMVC、Spring、MyBatis三個框架各有分工。SpringMVC框架負責請求的轉(zhuǎn)發(fā)和視圖管理,Spring框架實現(xiàn)業(yè)務對象管理,MyBatis框架則作為數(shù)據(jù)對象的持久化引擎完成數(shù)據(jù)持久化。4SSM框架及三個框架分工Spring框架Spring是一個開源框架,Spring是于2003年興起的一個輕量級的Java開發(fā)框架,Spring一個最大的目的就是使JavaEE(JavaPlatformEnterpriseEditionJava平臺企業(yè)版)開發(fā)更加容易,它是為了解決企業(yè)應用開發(fā)的復雜性而創(chuàng)建的。Spring是一個輕量級的控制反轉(zhuǎn)IoC(InversionofControl)和面向切面AOP(AspectOrientedProgramming)的容器框架。5MyBatis框架
將數(shù)據(jù)持久化到數(shù)據(jù)庫中常用的框架有Hibernate、MyBatis。下面分別介紹一下。
1.Hibernate簡介
Hibernate是當前最流行的ORM(ObjectRelationalMapping對象關(guān)系映射)框架之一,對JDBC(JavaDatabaseConnectivityJava數(shù)據(jù)庫連接)提供了較為完整的封裝。Hibernate的O/RMapping實現(xiàn)了POJO(PlainOrdinaryJavaObject普通的Java對象)和數(shù)據(jù)庫表之間的映射,以及SQL(StructuredQueryLanguage結(jié)構(gòu)化查詢語言)的自動生成和執(zhí)行。
6MyBatis框架2.MyBatis簡介
MyBatis是一個基于Java的持久層框架,它支持定制化SQL、存儲過程以及高級映射。MyBatis避免了幾乎所有的JDBC代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集。MyBatis可以使用簡單的XML或注解來配置和映射原生信息,將接口和Java的POJOs(PlainOrdinaryJavaObjects,普通的Java對象)映射成數(shù)據(jù)庫中的記錄。7MyBatis框架3.Hibernate和MyBatis的區(qū)別(1)開發(fā)速度
Hibernate的真正掌握要比Mybatis困難,Hibernate比Mybatis更加重量級一些。Mybatis需要我們手動編寫SQL語句,回歸最原始的方式,所以可以按需求指定查詢的字段,提高程序的查詢效率。
Hibernate也可以自己寫SQL語句來指定需要查詢的字段,但這樣破壞了Hibernate封裝以及簡潔性。8MyBatis框架3.Hibernate和MyBatis的區(qū)別(2)數(shù)據(jù)移植性Mybatis由于所有SQL語句都是依賴數(shù)據(jù)庫書寫的,所以擴展性,遷移性比較差。Hibernate與數(shù)據(jù)庫具體的關(guān)聯(lián)都在XML(ExtensibleMarkupLanguage可擴展標記語言)中,所以HQL(HibernateQueryLanguageHibernate查詢語言)對具體是用什么數(shù)據(jù)庫并不是很關(guān)心。9SpringMVC框架
SpringMVC屬于SpringFrameWork的后續(xù)產(chǎn)品,是一個強大靈活的Web框架。SpringMVC也是一種基于Java的實現(xiàn)了WebMVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進行職責解耦,基于請求驅(qū)動指的就是使用請求-響應模型,框架的目的就是幫助我們簡化開發(fā)。10本章總結(jié)了解SSM框架及三個框架分工了解Spring框架概念及IoC、AOP概念了解Hibernate框架概念了解MyBatis框架概念了解Hibernate框架和MyBatis框架的區(qū)別了解SpringMVC框架概念11謝謝!第二章Spring入門
本章內(nèi)容一、Spring框架概述二、Spring體系結(jié)構(gòu)三、Spring特征四、SpringIoC/DI概念五、SpringIoC容器的使用方法IOC容器的工作原理BeanFactory接口及常用實現(xiàn)類XmlBeanFactoryApplicationContext接口及常用實現(xiàn)類BeanFactory和ApplicationContext的區(qū)別六、Spring框架入門案例七、Spring5新特性14本章目標了解Spring框架了解Spring體系結(jié)構(gòu)了解Spring特征了解SpringIoC/DI概念掌握SpringIoC容器的使用方法掌握Spring框架入門案例理解Spring5的新特性15一、Spring框架概述
二、Spring體系結(jié)構(gòu)三、Spring特征四、SpringIoC/DI概念五、SpringIoC容器的使用方法六、Spring框架入門案例七、Spring5的新特性
16本章目錄Spring框架概述Spring簡介Spring是一個開源框架,它由RodJohnson創(chuàng)建。它是為了解決企業(yè)應用開發(fā)的復雜性而創(chuàng)建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限于服務器端的開發(fā)。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。目的:解決企業(yè)應用開發(fā)的復雜性。功能:使用基本的JavaBean代替EJB,并提供了更多的企業(yè)應用功能。范圍:任何Java應用。簡單來說,Spring是一個輕量級的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架。6Spring的發(fā)展歷程Spring版本發(fā)展歷史發(fā)布時間發(fā)布版本2003年Spring0.92004年Spring1.02006年Spring2.0FinalReleased2007年Spring2.52011年Spring3.1GArelease2013年Spring4.02014年Spring4.1.3released2015年Spring4.2、4.32016年Spring4.3GA2017年Spring5.x7Spring體系結(jié)構(gòu)19Spring特征輕量級
從大小和系統(tǒng)開支上說Spring都是輕量級的,而且Spring是非侵入式的:基于Spring開發(fā)的系統(tǒng)一般不依賴于Spring的類。反向控制Spring提倡反向控制實現(xiàn)松耦合。使用IOC,對象是被動接受依賴類而不是自動查找,實例化類的時候主動把他要的對象給他。面向切面
Spring對面向切面編程提供了強大的支持,通過把業(yè)務邏輯從系統(tǒng)服務中分離了出來,系統(tǒng)對象只做他們該做的事情,而不關(guān)心其他。9Spring的特征Spring即是一個容器又是一個框架。容器Spring包含并管理應用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創(chuàng)建——基于一個可配置原型(prototype),你的bean可以創(chuàng)建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關(guān)聯(lián)的??蚣躍pring提供了很多基礎(chǔ)的與業(yè)務邏輯無關(guān)的功能,比如:事務管理、持久化框架集成等等,使用Spring框架,開發(fā)人員可以專注于業(yè)務邏輯開發(fā),這個意義上講它是一個框架。10Spring特征方便程序的測試
可以用非容器依賴的編程方式進行幾乎所有的測試工作,在Spring里,測試不再是昂貴的操作,而是隨手可做的事情。例如:Spring對Junit4支持,可以通過注解方便的測試Spring程序。方便集成各種優(yōu)秀框架
Spring可以集成各種優(yōu)秀的開源框架,如Struts,Hibernate、Hessian、Quartz等。對聲明式事務的支持
在Spring中,我們可以從單調(diào)煩悶的事務管理代碼中解脫出來,通過聲明式方式靈活地進行事務的管理,這樣我們可以專注于業(yè)務邏輯開發(fā),提高開發(fā)效率和質(zhì)量。11SpringIoC/DI概述IoC(InversionofControl,控制反轉(zhuǎn)):IoC是Spring的核心概念,控制反轉(zhuǎn)就是應用本身不負責依賴對象的創(chuàng)建及維護,依賴對象的創(chuàng)建及維護是由外部容器負責的。這樣控制權(quán)就由應用轉(zhuǎn)移到了外部容器,控制權(quán)的轉(zhuǎn)移就是所謂反轉(zhuǎn)。
當某個JAVA實例(調(diào)用者)需要另一個JAVA實例(被調(diào)用者)時,在傳統(tǒng)的程序設(shè)計過程中,通常有由調(diào)用者來創(chuàng)建被調(diào)用者的實例,而控制反轉(zhuǎn)則轉(zhuǎn)移了控制權(quán),既把調(diào)用者的創(chuàng)建轉(zhuǎn)移到了外部容器(Spring容器)。12IOC和DI概念DependencyInjection(依賴注入):IoC也是一種設(shè)計模式,有DependencyInjection(依賴注入)和ServiceLocator(服務定位器)兩種實現(xiàn)方式,Spring框架采用依賴注入實現(xiàn)IoC。依賴注入是在運行期,由外部容器動態(tài)地將依賴對象注入到組件中。即通過使用Spring框架,開發(fā)人員將不必在自己的代碼中維護對象之間的依賴關(guān)系,只需在配置文件中進行設(shè)定,Spring會自動依據(jù)配置信息來維護對象之間的依賴關(guān)系。注:Spring框架結(jié)合簡單的JavaBean實現(xiàn)了以前只有EJB才能完成的功能。13SpringIoC容器Spring的IoC容器概述Spring的IoC容器實現(xiàn)了控制反轉(zhuǎn),即在開發(fā)過程中,開發(fā)人員不需要關(guān)心容器是怎樣的,也不需要調(diào)用容器的任何API。容器會自動進行被管理對象的初始化及對象之間依賴關(guān)系的維護。在Spring中,最重要的是兩個包,提供了IoC容器的基本功能
org.springframework.beans包
org.springframework.context包14SpringIoC容器Ioc容器工作原理org.springframework.beans.factory.BeanFactory是Spring容器(也叫Spring
IoC容器)的實際代表者,BeanFactory是IoC容器的核心接口。它的職責包括:實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。這里的Bean是一種廣泛意義上的JavaBean對象,包括了任何由Spring的IoC容器進行初始化、裝配以及其他方面管理的Java對象。它既可是開發(fā)人員自己開發(fā)的應用對象,也可是Spring或其他組件所提供的Java對象。從上圖可以看到,我們可以在SpringIoC容器中配置應用程序中所需要的信息,如
POJO業(yè)務類,這些業(yè)務類(Bean)之間相互依賴。Spring容器負責實例化、定位、配置應用程序中的對象及建立這些對象間的依賴。整個IoC容器就是一個大的工廠,為應用程
序提供bean。26SpringIoC容器BeanFactory接口提供了多個實現(xiàn)類來供開發(fā)人員使用,最常使用的是org.springframework.beans.factory.xml.XmlBeanFactory類,是通過XML格式的文件來配置Bean對象以維護對象之間的關(guān)系。使用XML格式的配置文件時,配置文件的最頂層是<beans>元素,其內(nèi)部包含一個或多個<bean/>元素,其中每一個<bean/>元素定義了一個bean的實例化信息以及與其他bean之間的關(guān)系在初始化容器時,需要一個用于訪問配置文件的org.springframework.core.io.Resource對象作為構(gòu)建容器對象的參數(shù)。Resource對象本身是一個接口,目的是為提供一個使用不同方式訪問資源文件的統(tǒng)一方法,支持的方式包括文件系統(tǒng)、二進制數(shù)組、二進制流、URL、類路徑等
由于訪問配置文件的方式不同,就決定可使用不同方式來初始化容器對象,直接通過文件系統(tǒng)訪問配置文件的初始化代碼如下:Resourcers=newFileSystemResource(“/hw/beans-config.xml”);
BeanFactoryfactory=newXmlBeanFactory(rs);
實際中更多是通過類路徑的方式來訪問配置文件,將配置文件放在CLASSPATH所指定的目錄中,初始化代碼如下:Resourcers=newClassPathResource(“beans-config.xml”);
BeanFactoryfactory=newXmlBeanFactory(rs);
注:在實際的Web應用開發(fā)中,不需開發(fā)人員自己進行容器的初始化,生成BeanFactory對象,只需在web.xml文件中進行簡單配置既可。16SpringIoC容器BeanFactory接口包含的幾個基本方法:BooleancontainsBean(String
name)
判斷Spring容器是否包含id為name的Bean實例ClassgetType(String
name)
返回容器中指定Bean實例的類型ObjectgetBean(String
name)
返回以給定名字注冊的bean實例。根據(jù)bean的配置情況,如果為singleton模式將返回一個共享的實例,否則將返回一個新建的實例。如果沒有找到指定的bean,該方法可能會拋出BeansException異常(實際上將拋出NoSuchBeanDefinitionException異常),在對bean進行實例化和預處理時也可能拋出異常17SpringIoC容器ApplicationContext接口:大部分時候,我們都不會使用BeanFactory實例作為Spring容器,而是使用ApplicationContext實例作為容器,該容器被稱為Spring上下文。ApplicationContext是BeanFactory子接口,它增強了BeanFactory的功能。ApplicationContext實現(xiàn)類描述org.springframework.context.support.ClassPathXMLApplicationContext從類路徑中的XML文件載入上下文定義信息org.springframework.context.support.FileSystemXmlApplicationContext從文件系統(tǒng)中的XML文件載入上下文定義信息表ApplicationContext實現(xiàn)類18SpringIoC容器ApplicationContext接口常用的實現(xiàn)類:ClassPathXmlApplicationContext:從類路徑中的XML文件載入上下文定義信息,把上下文定義文件當成類路徑文件,例:
ApplicationContextcontext=newClassPathXmlApplicationContext(“beans- config.xml”);FileSystemXmlApplicationContext:從文件系統(tǒng)中的XML文件載入上下文信息,例:
ApplicationContextcontext=new FileSystemXmlApplicationContext(“d:/sp/beans-config.xml”);
區(qū)別:FileSystemXmlApplicationContext只能在指定的路徑尋找文件beans-config.xml;ClassPathXmlApplicationContext可在整個類路徑中尋找。XmlWebApplicationContext:從web系統(tǒng)中的XML文件載入載入上下文定義信息19SpringIoC容器BeanFactory與ApplicationContext的區(qū)別ApplicationContext與BeanFactory都是Spring容器,職責都有實例化、定位、配置應用程序中的對象及建立這些對象間的依賴,但ApplicationContext提供更多功能:ApplicationContext繼承MessageResource接口,因此提供國際化支持。資源訪問,比如URL和文件。事件機制,可向注冊為監(jiān)聽器的Bean發(fā)送事件。載入多個配置文件。以聲明式的方式啟動、并創(chuàng)建Spring容器。關(guān)于單實例Bean如何被載入:Bean工廠延遲載入所有的Bean,直到getBean()方法被調(diào)用時Bean才被創(chuàng)建;spring上下文會在上下文啟動后預載入所有的單實例Bean,確保使用時已準備好。20Spring框架入門案例準備工作:Spring的下載和安裝(使用spring5.0.2版本)請從Spring官網(wǎng)中下載Spring開發(fā)包spring-framework-5.0.2.RELEASE-dist.zip,解壓縮下載commons-logging.jar包dist文件夾下包含spring的jar包,由21個分模塊的jar包組成,不同的jar包提供不同的功能,這樣允許開發(fā)者根據(jù)不同需要選擇不同的jar包。把spring-beans-5.0.2.RELEASE.jar、spring-context-5.0.2.RELEASE.jar、spring-core-5.0.2.RELEASE.jar、spring-expression-5.0.2.RELEASE.jar和spring的依賴jar包(commons-logging.jar)引入工程中。21使用spring框架案例演示模擬完成保存用戶信息22Spring框架入門案例根據(jù)上述案例,體會spring容器的好處:通過這種依賴注入,javaEE應用中的各種組件不需要以硬編碼方式耦合在一起嗎,起到很好的解耦作用。降低了業(yè)務對象替換的復雜性。單例模式對象的生命周期有spring容器進行管理,信息可以共享。23Spring5新特性
Spring5.0是在2013年發(fā)布Spring4后的第一個大版本,5.0M1在2016年7月28日發(fā)布。隨著慢慢的推廣,使用它的人數(shù)肯定也會越來越多,那么Spring5有哪些新的特性呢?JDK版本升級
Spring5的代碼基于Java8的語法規(guī)范,
因此要想使用Spring5,JDK的版本至少要在8.0以上。24Spring5新特性Core框架修訂
基于Java8的反射增強,方法的參數(shù)在Spring5中可以高效的被訪問核心的Spring接口,提供利用了Java8的默認接口實現(xiàn),default方法,提供了一些可選的聲明@Nullable和@NotNull注解,精確的標記了方法的參數(shù)和返回值,這樣可以在編譯的時候處理null值,而不至于在運行的時候拋出空指針異常,NullPointerExceptions。
在日志端,Spring5.0提供了CommonLogging的橋接模塊,spring-jcl,代替了標準的CommonLogging,同時它還可以自動的檢測Log4J2.x、SLF4J、JUL(java.util.logging),而不需要額外的依賴。25Spring5新特性Kotlin函數(shù)式編程Spring5.0引入了JetBrains的Kotlin語言支持,Kotlin是一種支持函數(shù)式編程的面向?qū)ο缶幊陶Z言。Kotlin也運行在JVM之上,有了Kotlin的支持,開發(fā)者可以使用Spring的函數(shù)式編程處理Web的入口點和Bean的注冊。26Spring5新特性響應式編程模型
激動人心的Spring5.0特性就是它的響應式Web編程ReactiveStreams(響應式流),是NetFlix、Pivotal、Typesafe、RedHat、Oracle、Twitter和Spray.io共同開發(fā)的一套規(guī)范。它提供了一些通用的API,實現(xiàn)的話可以自己控制,就像Hibernate之JPA,JPA是api,Hibernate是實現(xiàn)。
響應式流是Java9的正式模塊,但是在Java8中,我們需要引入額外的依賴。Spring5.0的流式支持基于響應式流的API的ProjectReactor。Spring5.0有個新的模塊叫做spring-webflux,可以支持響應式的Http和WebSocket客戶端。27Spring5新特性測試改進Spring5.0完全支持Junit5,在TestContext框架中,可以并行的執(zhí)行測試。對于響應式的編程,Spring-test提供了WebTestClient來測spring-webflux。WebTestClient,就像MockMvc不需要運行的服務器。當然Spring5.0還是支持Junit4的,在未來的一段時間里Junit4是都會存在的。28Spring5新特性額外庫支持Spring5.0現(xiàn)在支持下面的庫版本:? JackSon2.6+? EhCache2.10+/3.0GA? Hibernate5.0+? JDBC4.0+? XmlUnit2.x+? OkHttp3.x+? Netty4.1+29本章總結(jié)Spring框架概述Spring體系結(jié)構(gòu)Spring特征SpringIoC/DI概念SpringIoC容器的使用方法IOC容器的工作原理BeanFactory接口及常用實現(xiàn)類XmlBeanFactoryApplicationContext接口及常用實現(xiàn)類BeanFactory和ApplicationContext的區(qū)別Spring框架入門案例Spring5新特性30謝謝!第三章Spring的基本用法
本章目標掌握依賴注入的類型掌握依賴配置的方式掌握Bean的自動裝配方法掌握Bean的作用域范圍掌握Bean的生命周期掌握Bean的基于Annotation的裝配44本章教學內(nèi)容依賴注入的類型構(gòu)造方法注入設(shè)值注入依賴配置方式普通屬性值合作者Bean嵌套Bean集合屬性值Bean自動裝配Bean作用域范圍Bean的生命周期Bean的基于Annotation的裝配45依賴注入的類型構(gòu)造器注入通過類的構(gòu)造方法來設(shè)置依賴關(guān)系的方式被稱為構(gòu)造注入設(shè)值方法注入通過類的setter方法為目標Bean注入依賴關(guān)系的方式被稱為設(shè)值注入p名稱空間注入46設(shè)值注入設(shè)值注入是指IOC容器使用屬性的setter方法來注入被依賴的實例。這種注入方式簡單、直觀,因而在Spring的依賴注入里大量使用。Bean與Bean之間的依賴關(guān)系放在配置文件里組織(在引入spring之前,是通過寫代碼來組織),通過配置文件的指定,spring精確地為每個Bean注入屬性。<property…/>標簽元素Spring會自動接管每個<bean…/>定義里的<property…/>元素定義,spring會在調(diào)用無參數(shù)的構(gòu)造方法創(chuàng)建默認的Bean實例后,調(diào)用對應的setter方法為程序注入屬性。<property…/>定義的屬性值將不再由該Bean來主動設(shè)置、管理,而是接受Spring的注入。
47設(shè)值注入案例演示:
人使用石斧砍柴換成人使用鋼斧砍柴從上面示例程序中應該可以看出,依賴注入以配置文件管理Bean實例直接的耦合,讓Bean實例之間的耦合從代碼層次分離出來,依賴注入是一種優(yōu)秀的解耦方式。
48構(gòu)造注入構(gòu)造注入是指IOC容器利用構(gòu)造器來設(shè)置依賴關(guān)系。<constructor-arg…/>標簽元素指定構(gòu)造器的參數(shù)把設(shè)置注入的案例修改成構(gòu)造注入,如何修改?兩個案例執(zhí)行效果完全一樣,區(qū)別在于:創(chuàng)建Person實例中Axe屬性的時機不同—設(shè)置注入是先通過無參數(shù)的構(gòu)造器創(chuàng)建一個Bean實例,然后調(diào)用對應的setter方法注入依賴關(guān)系;而構(gòu)造注入是直接調(diào)用有參數(shù)的構(gòu)造器,當Bean實例創(chuàng)建完成后,已經(jīng)完成了依賴關(guān)系的注入。
49p名稱空間注入
我們可以使用p名稱空間進行更簡潔的XML配置。越來越多的XML文件采用屬性而非子元素配置信息。Spring從2.5版本開始引入了一個新的p命名空間,可以通過元素屬性的方式配置bean的屬性,使用p命名空間后,基于XML的配置方式將進一步簡化。
可以通過在頭文件中加入xmlns:p="/schema/p"實現(xiàn)。
使用p的命名空間注入,它的本質(zhì)還是使用set方法進行注入依賴,且需要導入命名空間p。使用p命名空間注入使得XML配置更簡潔。50兩種注入方式的對比這兩種注入方式都是非常用用的,沒有絕對的好壞,只是適應的場景有所不同。相比之下,設(shè)值注入具有如下優(yōu)點:與傳統(tǒng)的JavaBean的寫法更相似,程序員更容易理解、接收對于復雜的依賴關(guān)系,如果采用構(gòu)造注入,會導致構(gòu)造器過去臃腫,難以閱讀。
51兩種注入方式的對比這兩種注入方式都是非常用用的,沒有絕對的好壞,只是適應的場景有所不同。相比之下,設(shè)值注入具有如下優(yōu)點:與傳統(tǒng)的JavaBean的寫法更相似,程序員更容易理解、接收對于復雜的依賴關(guān)系,如果采用構(gòu)造注入,會導致構(gòu)造器過去臃腫,難以閱讀。
52配置依賴根據(jù)前面的介紹,Java應用中各組件的相互調(diào)用的實質(zhì)可以歸納為依賴關(guān)系,根據(jù)注入方式的不同,通常表現(xiàn)為如下兩種形式:<property/><constructor-arg/>不管是屬性,還是構(gòu)造器參數(shù),都視為Bean的依賴,接收spring容器管理,依賴關(guān)系的值要么是一個確定的值,要么是spring容器中其他bean的引用。所以spring允許通過如下元素為bean實例的屬性指定值:Value、ref、bean、list、set、map及props53配置依賴—設(shè)值普通屬性值<value/>元素用于指定字符串、基本類型的屬性值,spring使用xml解析器來解析出這些數(shù)據(jù),然后利用java.beans.PropertyEditor完成類型轉(zhuǎn)換:從String類型轉(zhuǎn)換為所需要的參數(shù)值類型。54配置依賴—配置合作者Bean如果需要為Bean設(shè)值的屬性值是容器中的另一個Bean實例,則應該使用<ref/>元素。55配置依賴—注入嵌套Bean如果某個Bean所依賴的Bean不想被spring容器直接訪問,可以使用嵌套Bean。<bean/>元素用來定義嵌套Bean,嵌套Bean只對嵌套它的外部Bean有效,Spring容器無法直接訪問嵌套Bean,因此定義嵌套Bean時無須指定id屬性。56配置依賴—注入集合值如果Bean的屬性是個集合,則可以使用集合元素,<list/><set/><map/>和<props/>元素分別用來設(shè)置類型為List、Set、Map和Properties的集合屬性值。57Bean的作用域通過設(shè)定<bean/>標簽的scope屬性設(shè)定bean的作用域作用域描述singleton單實例作用域,這是Spring容器默認的作用域,使用singleton作用域生成的是單實例,在整個Bean容器中僅保留一個實例對象供所有調(diào)用者共享引用。單例模式對于那些無會話狀態(tài)的Bean(如輔助工具類、DAO組件、業(yè)務邏輯組件等)是最理想的選擇。prototype原型模式,這是多實例作用域,針對每次不同的請求,Bean容器均會生成一個全新的Bean實例以供調(diào)用者使用。prototype作用域非常適用于那些需要保持會話狀態(tài)的Bean實例,有一點值得注意的就是,Spring不能對一個prototypeBean的整個生命周期負責,容器在初始化、裝配好一個prototype實例后,將它交給客戶端,隨后就對該prototype實例不聞不問了。因此,客戶端要負責prototype實例的生命周期管理。58Bean的作用域通過設(shè)定<bean/>標簽的scope屬性設(shè)定bean的作用域作用域描述request針對每次HTTP請求,Spring容器會根據(jù)Bean的定義創(chuàng)建一個全新的Bean實例,且該Bean實例僅在當前HTTPrequest內(nèi)有效,因此可以根據(jù)需要放心地更改所建實例的內(nèi)部狀態(tài),而其他請求中根據(jù)Bean定義創(chuàng)建的實例,將不會看到這些特定于某個請求的狀態(tài)變化。當處理請求結(jié)束,request作用域的Bean實例將被銷毀。該作用域僅在基于web的SpringApplicationContext情形下有效。session針對某個HTTPSession,Spring容器會根據(jù)Bean定義創(chuàng)建一個全新的Bean實例,且該Bean實例僅在當前HTTPSession內(nèi)有效。與request作用域一樣,我們可以根據(jù)需要放心地更改所創(chuàng)建實例的內(nèi)部狀態(tài),而別的HTTPSession中根據(jù)Bean定義創(chuàng)建的實例,將不會看到這些特定于某個HTTPSession的狀態(tài)變化。當HTTPSession最終被廢棄的時候,在該HTTPSession作用域內(nèi)的Bean實例也會被廢棄掉。該作用域僅在基于Web的SpringApplicationContext情形下有效。59Bean的作用域通過設(shè)定<bean/>標簽的scope屬性設(shè)定bean的作用域作用域描述application將單個Bean定義的作用域限定為的-ServletContext。為每個ServletContext對象創(chuàng)建一個實例。該作用域僅在基于Web的SpringApplicationContext情形下有效。websocket將單個Bean定義的作用域限定為的WebSocket。為每個websocket對象創(chuàng)建一個實例。該作用域僅在基于Web的SpringApplicationContext情形下有效。60Bean的自動裝配使用自動裝配注入合作者BeanSpring能自動裝配Bean與Bean之間的依賴關(guān)系,即無須使用ref顯式指定依賴Bean。由BeanFactory檢查XML配置文件內(nèi)容,根據(jù)某種規(guī)則,為主調(diào)Bean注入依賴關(guān)系。Spring的自動裝配可通過<beans/>元素的default-autowire屬性指定,也可通過<bean/>元素的autowire屬性指定。自動裝配可以減少配置文件的工作量,但降低了依賴關(guān)系的透明性和清晰性。61Bean的自動裝配使用autowire屬性配置自動裝配,autowire屬性可以接受如下值:模式說明no不使用自動裝配。必須通過ref元素指定依賴,這是默認設(shè)置。由于顯式指定協(xié)作者可以使配置更靈活、更清晰,因此對于較大的部署配置,推薦采用該設(shè)置。而且在某種程度上,它也是系統(tǒng)架構(gòu)的一種文檔形式。byName根據(jù)屬性名自動裝配。此選項將檢查容器并根據(jù)名字查找與屬性完全一致的bean,并將其與屬性自動裝配。例如,在bean定義中將autowire設(shè)置為byname,而該bean包含master屬性(同時提供setMaster(..)方法),Spring就會查找名為master的bean定義,并用它來裝配給master屬性。62Bean的自動裝配模式說明byType如果容器中存在一個與指定屬性類型相同的bean,那么將與該屬性自動裝配。如果存在多個該類型的bean,那么將會拋出異常,并指出不能使用byType方式進行自動裝配。若沒有找到相匹配的bean,則什么事都不發(fā)生,屬性也不會被設(shè)置。constructor與byType的方式類似,不同之處在于它應用于構(gòu)造器參數(shù)。如果在容器中沒有找到與構(gòu)造器參數(shù)類型一致的bean,那么將會拋出異常。63Bean的基于Annotation的裝配
在Spring中,使用基于XML配置的形式完成Bean的裝配,如果應用中有很多的Bean時,XML配置文件會比較臃腫,后期軟件維護或升級會有一定的困難。為此Spring提供了第三種Bean的裝配形式,基于注解(Annotation)的裝配。這也是最常用的裝配方式。Spring中定義的關(guān)于Bean裝配的常用注解可以分為創(chuàng)建對象的注解和注入數(shù)據(jù)的注解兩類。Bean的基于Annotation的裝配
用于創(chuàng)建對象的注解
@Component:標注一個普通的SpringBean類,把普通Bean實例化到Spring容器中,相當于XML配置文件中的<beanid=""class=""/>。該注解包括屬性value,用于指定bean的id。當不寫時,默認值是當前類名首字母小寫。
@Controller:是@Component的一個衍生注解,一般用于表現(xiàn)層,標注一個控制器組件類。
@Service:是@Component的一個衍生注解,一般用于業(yè)務邏輯層,標注一個業(yè)務邏輯組件類。
@Repository:是@Component的一個衍生注解,一般用于持久層,標注一個DAO組件類。65Bean的基于Annotation的裝配用于創(chuàng)建對象的注解【注意】@Controller、@Service、@Repository三個衍生注解的作用及屬性和@Component相同。它們只是Spring框架為我們提供了語義上的分層,所以注解之間可以互換,但實際應用中還是使用語義上分層的注解比較好。66Bean的基于Annotation的裝配用于注入數(shù)據(jù)的注解
@AutoWired:用于注入數(shù)據(jù)的注解,數(shù)據(jù)類型為其他類型的bean。裝配過程為自動按照類型進行匹配,如果Spring容器中有唯一類型匹配成功,則可以直接注入。如果有多個同類型的匹配時,然后再用變量名稱作為bean的id從Spring容器中查找,如果找到也可以注入成功。如果沒有匹配的則報錯。
67Bean的基于Annotation的裝配用于注入數(shù)據(jù)的注解
@Resource:把@Resouce注解放在@Autowired下面說,是因為它們作用非常相似。都是自動裝配bean對象。@Resource的裝配順序:(1)@Resource后面沒有任何內(nèi)容,默認通過name屬性去匹配bean,找不到再按type去匹配。
(2)指定了name或者type則根據(jù)指定的類型去匹配bean。(3)指定了name和type則根據(jù)指定的name和type去匹配bean,任何一個不匹配都將報錯。68Bean的基于Annotation的裝配區(qū)分一下@Autowired和@Resource兩個注解的區(qū)別
(1)@Autowired默認按照byType方式進行bean匹配,@Resource默認按照byName方式進行bean匹配。(2)@Autowired是Spring的注解,@Resource是JavaEE的注解,這個看一下導入注解的時候這兩個注解的包名就一清二楚了。[注意]Spring屬于第三方的,JavaEE是Java自己的東西,因此,建議使用@Resource注解,以減少代碼和Spring之間的耦合。69Bean的基于Annotation的裝配用于指定Bean作用域的注解
@Scope:用于指定bean的作用域范圍,范圍取值和XML配置是一致的,默認值為singleton。使用屬性value指定作用域范圍。70Bean的基于Annotation的裝配用于將外部的值動態(tài)注入到Bean
@Value:用于不通過XML配置文件注入屬性的情況,通過@Value將外部的值動態(tài)注入到Bean中,使用的情況有:注入普通字符串注入操作系統(tǒng)屬性注入表達式結(jié)果注入其他Bean屬性注入文件資源注入URL資源71本章總結(jié)依賴注入的類型構(gòu)造方法注入設(shè)值注入依賴配置方式普通屬性值合作者Bean嵌套Bean集合屬性值Bean自動裝配Bean作用域范圍Bean的生命周期Bean的基于Annotation的裝配72謝謝!第4章面向切面編程本章目標理解AOP的概念
掌握AOP的相關(guān)術(shù)語掌握Spring支持AOP的實現(xiàn)方式掌握基于XML的配置方式實現(xiàn)AOP編程的方法掌握基于注解(Annotation)的方式實現(xiàn)AOP編程的方法75本章教學內(nèi)容AOP的概念AOP的相關(guān)術(shù)語Spring支持AOP的實現(xiàn)方式基于注解(Annotation)的方式實現(xiàn)AOP編程的方法基于XML的配置方式實現(xiàn)AOP編程的方法76AOP的概述
AOP利用一種稱為“橫切”的技術(shù),剖解開封裝的對象內(nèi)部,并將那些影響了多個類的公共行為封裝到一個可重用模塊,并將其名為“Aspect”。使用AOP的目的為AOP能夠?qū)⒛切┡c業(yè)務無關(guān),卻為業(yè)務模塊所共同調(diào)用的邏輯或責任(例如事務處理、日志管理、權(quán)限認證等)封裝起來,便于減少系統(tǒng)的重復代碼,降低模塊間的耦合度,并有利于未來的可拓展性和可維護性。AOP的主要的功能是:日志記錄,性能統(tǒng)計,安全控制,事務處理,異常處理等。77AOP有關(guān)術(shù)語切面(Aspect)
一個關(guān)注點的模塊化,這個關(guān)注點實現(xiàn)可能另外橫切多個對象。切面一般定義為一個Java類,事務管理是企業(yè)Java應用程序中橫切關(guān)注的一個很好的例子。連接點(Joinpoint)
在程序執(zhí)行過程中的一點,例如方法的執(zhí)行或異常的處理。在SpringAOP中,連接點始終代表方法的執(zhí)行。通知(Advice)
在特定的連接點(Joinpoint),AOP框架執(zhí)行的動作。通知有各種類型,有關(guān)通知類型將在后面具體講解。78AOP有關(guān)術(shù)語切入點(Pointcut)
一個匹配連接點的正則表達式。當一個連接點匹配到切點時,一個關(guān)聯(lián)到這個切點的特定的通知(Advice)會被執(zhí)行。AOP代理(AOPProxy)
AOP框架創(chuàng)建的對象,包含通知。在Spring中,AOP代理可以是JDK動態(tài)代理或者CGLIB代理??椚耄╓eaving)
負責將切面和目標對象鏈接,以創(chuàng)建通知對象。這可以在編譯時完成(例如使用AspectJ編譯器),也可以在運行時完成。Spring和其他純JavaAOP框架一樣,在運行時完成織入。目標對象(TargetObject)
包含連接點的對象。也被稱作被通知或被代理對象。79AOP代理簡要的說Spring使用兩種機制實現(xiàn)AOP代理:一是使用Java的動態(tài)代理,即java.lang.reflect.Proxy類創(chuàng)建AOP代理。二是使用CGLIB庫自動生成目標對象的子類,同時織入通知。SpringAOP默認將標準JDK動態(tài)代理用于AOP代理。這使得可以代理任何接口(或一組接口)。該動態(tài)代理要求目標對象必須要實現(xiàn)接口(只有這樣才能創(chuàng)建代理),而CGLIB則沒有這種限制。80AOP代理SpringAOP也可以使用CGLIB代理。這對于代理類接口不是必需的。如果業(yè)務對象未實現(xiàn)接口,則默認情況下使用CGLIB。因為對接口而不是類進行編程是一種好習慣;業(yè)務類通常將實現(xiàn)一個或多個業(yè)務接口。在那些需要建立在接口上未聲明的方法或需要將代理對象作為具體類型傳遞給方法的情況下(在極少數(shù)情況下),可以強制使用CGLIB代理。Spring中的AOP代理由Spring的IoC容器負責生成、管理,其依賴關(guān)系也由IoC容器負責管理。81AOP代理面向AOP編程只需要程序員參加以下3個部分:定義普通業(yè)務組件定義切入點定義通知,也叫增強處理進行AOP編程的關(guān)鍵就是定義切入點和通知。一旦定義了合適的切入點和增強處理,AOP框架將會自動生成AOP代理。82AOP實戰(zhàn)
AspectJ簡介
在講解實現(xiàn)AOP編程之前,我們需要先了解一下AspectJ。AspectJ實際上是對AOP編程思想的一個實踐,是一個基于Java語言的AOP框架,它提供了強大的AOP功能。Spring2.0以后,SpringAOP引入了對AspectJ的支持。在新版本的Spring框架中我們也建議直接使用AspectJ進行編程。
使用AspectJ實現(xiàn)AOP編程有兩種方式:
一種是基于XML配置文件的方式,這種為使用spring配置文件來定義切入點和增強處理。
第二種是基于注解(Annotation)方式,該種為使用@Aspect、@Pointcut等Annotation來標注切入點和增強處理。83Spring通知的類型Advice類型:前置通知[Beforeadvice]:
在連接點前面執(zhí)行,前置通知不會影響連接點的執(zhí)行,除非此處拋出異常。正常返回通知[Afterreturningadvice]
在連接點正常執(zhí)行完成后執(zhí)行,如果連接點拋出異常,則不會執(zhí)行。
異常返回通知[Afterthrowingadvice]:在連接點拋出異常后執(zhí)行。
最終通知[After(finally)advice]:
在連接點執(zhí)行完成后執(zhí)行,不管是正常執(zhí)行完成,還是拋出異常,都會執(zhí)行返回通知中的內(nèi)容。
84Spring通知的類型Advice類型:環(huán)繞通知[Aroundadvice]:
環(huán)繞通知圍繞在連接點前后,比如一個方法調(diào)用的前后。這是最強大的通知類型,能在方法調(diào)用前后自定義一些操作。環(huán)繞通知還需要負責決定是繼續(xù)處理Joinpoint(調(diào)用ProceedingJoinPoint的proceed方法)還是中斷執(zhí)行。85切入點(pointcut)的定義切入點的定義在SpringAOP中切入點表達式大量使用execution表達式,其中execution就是一個切入點指示符。execution:用于匹配執(zhí)行方法的連接點,這是SpringAOP中最主要的切入點指示符。execution表達式的格式如下:execution(modifiers-pattern?ret-type-patterndeclaring-type-pattern?name-parrtern(param-pattern)throws-pattern?)86切入點(pointcut)的定義切入點的定義modifiers-pattern:指定方法的修飾符,支持通配符,該部分可省略。ret-type-pattern:指定方法返回值類型,支持通配符,可以使用“*”通配符來匹配所有返回值類型。declaring-type-pattern:指定方法所屬的類,支持通配符,該部分可省略。name-parrtern:指定匹配方法名,支持通配符,可以使用“*”通配符來匹配所有方法。param-pattern:指定方法聲明中的形參列表,支持兩個通配符:“*”和“..”,其中“*”代表一個任意類型的參數(shù),而“..”代表0個或多個任意類型的參數(shù),例如,()匹配一個不接受任何參數(shù)的方法,而(..)匹配了一個接受任意數(shù)量參數(shù)的方法(0個或多個),(*)匹配一個接受一個任意類型參數(shù)的方法。(*,String)匹配了一個接受兩個參數(shù)的方法,第一個可以使任意類型,第二個則必須是String類型。throws-pattern:指定方法聲明拋出的異常,支持通配符,該部分可省略。87切入點(pointcut)的定義下面給出常見切入點表達式的一些示例:任意公共方法的執(zhí)行:execution(public**(..))任何一個以“set”開始的方法的執(zhí)行:execution(*set*(..))AccountService接口的任意方法的執(zhí)行:execution(*com.xyz.service.AccountService.*(..))定義在service包里的任意方法的執(zhí)行:execution(*com.xyz.service.*.*(..))定義在service包或者子包里的任意方法的執(zhí)行:execution(*com.xyz.service..*.*(..))88基于XML配置的AOP編程使用XML配置方式是通過XML文件來提供這些信息,包括切面、切入點、增強處理,從而實現(xiàn)AOP編程。準備工作:添加支持AOP編程的jar包
需要在支持SpringIOC的核心jar包的基礎(chǔ)上,添加aopalliance-1.0.jar、aspectjweaver.jar、spring-aop-5.0.2.RELEASE.jar、spring-aspects-5.0.2.RELEASE.jar,如下圖所示。89基于XML配置的AOP編程準備工作:添加支持AOP編程的jar包
下面簡要介紹這幾個包。aopalliance-1.0.jar:是AOP聯(lián)盟提供的API包,里面包含了針對面向切面的接口。aspectjweaver.jar:是spring的切入點表達式需要用的包。spring-aop-5.0.2.RELEASE.jar:包含了使用SpringAOP特性時所需要的類,利用這個jar文件我們可以使用基于AOP的Spring特性。如聲明式的事物管理,日志系統(tǒng)引入等等。spring-aspects-5.0.2.RELEASE.jar:提供了對AspectJ的支持,以便方便的將面向切面的功能集成到IDE中。AspectJ是一個面向切面的框架,他擴展了Java語言。AspectJ定義了AOP語法,所以它有一個專門的編譯器來生成Java字節(jié)規(guī)范的class文件。90基于XML配置的AOP編程編寫切面LogAspect.java編寫業(yè)務邏輯類CustomerServiceImpl.java配置切面
既然使用XML配置方式實現(xiàn)AOP編程,就是在XML文件中定義切面、切入點、通知。
91基于注解(Annotation)的AOP編程使用注解的方式已經(jīng)逐漸成為了主流,所以我們利用上面的例子來說明如何用注解來開發(fā)SpringAOP。
下面通過表來列舉一下Spring中的AspectJ注解92基于注解(Annotation)的AOP編程
表Spring中的AspectJ注解注解說明@Aspect配置切面@Before前置通知,在連接點方法前調(diào)用@Around環(huán)繞通知,它將覆蓋原有方法,但是允許你手動定義通知執(zhí)行順序@After最終通知,在連接點方法后調(diào)用@AfterReturning正常返回通知,在連接點方法執(zhí)行并正常返回后調(diào)用,要求連接點方法在執(zhí)行過程中沒有發(fā)生異常@AfterThrowing異常返回通知,當連接點方法異常時調(diào)用93本章總結(jié)AOP的簡介AOP的相關(guān)術(shù)語AOP代理基于xml的配置方式實現(xiàn)AOP編程基于注解(Annotation)的方式實現(xiàn)AOP編程94謝謝!第五章事務管理
本章目標了解事務的概念了解JDBC事務管理掌握spring事務管理的實現(xiàn)方式編程式事務管理聲明式事務管理了解Spring事務的隔離級別和傳播方式97本章知識點事務的概述JDBC事務管理實現(xiàn)方式Spring事務管理的實現(xiàn)方式編程式事務管理聲明式事務管理Spring事務的隔離級別和傳播方式98事務概述事務定義:數(shù)據(jù)庫系統(tǒng)為了保證數(shù)據(jù)操作的完整性和一致性,引入了事務這個重要的概念,所謂事務,就是將一系列的數(shù)據(jù)庫操作作為一個整體來執(zhí)行。如對數(shù)據(jù)庫存取,就是一組SQL指令,這一組SQL指令必須全部執(zhí)行成功;如果因為某個原因(例如其中一行SQL有錯誤),則先前所執(zhí)行過的SQL指令撤銷。99JDBC事務管理JDBC技術(shù)的事務管理:在JDBC中,可以用Connection的setAutoCommit()方法,給定它false參數(shù)。在一連串的SQL語句后面,調(diào)用Connection的commit()來送出變更。如果中間發(fā)生錯誤,則調(diào)用rollback()來撤銷所有的執(zhí)行,例如:try{connection.setAutoCommit(false);…//一連串SQL操作
mit();//執(zhí)行成功,提交所有變更}catch(SQLExceptione){connection.rollback();//發(fā)生錯誤,撤銷所有變更}100JDBC事務管理101JDBC事務管理102JDBC事務管理ApplicationContext.xml配置文件103Spring事務管理Spring事務概述:
Spring框架提供了極其強大而簡便的事務處理功能,其核心便是PlatformTransactionManager抽象接口。Spring將所有的事務管理都抽象為PlatformTransactionManager、TransactionStatus和TransactionDefinition這3個接口,而無論其底層關(guān)聯(lián)的具體的事務究竟是JDBC事務、JTA事務,還是ORM框架自定義的事務。PlatformTransactionManager:定義了事務管理器,所有與事務相關(guān)的操作都有它管理;TransactionStatus:代表事務本身,它提供了簡單的控制事務執(zhí)行和查詢事務狀態(tài)的方法;104Spring事務管理Spring事務概述:TransactionDefinition
:定義了事務的規(guī)則(事務的隔離級別、傳播行為、事務超時、只讀狀態(tài)),
在啟動事務時,事務管理器會根據(jù)TransactionDefinition來啟動合適的事務;105Spring事務管理Spring事務概述:在Spring中實現(xiàn)事務管理有兩種方式,一種是傳統(tǒng)的編程式事務管理,也就是程序員在編寫程序代碼實現(xiàn)事務的管理,具體包括定義事務的開始、在程序異常時進行事務的回滾及程序正常執(zhí)行后的事務提交。另一種則是基于AOP技術(shù)實現(xiàn)的聲明式事務管理,事務管理本身是一項共有的系統(tǒng)級服務功能,完全可以將事務管理抽象成一個事務切面,程序員不再關(guān)心事務管理的問題,把主要精力放在核心業(yè)務邏輯代碼的編寫上,然后在需要進行事務管理的方法上切入事務切面,使之具有事務管理的功能,達到事務管理的目的。106Spring事務管理Spring編程式事務:PlatformTransactionManager:事務管理器接口,只定義了3個方法:getTransaction()獲取事務的狀態(tài);
commit();rollback();事務管理器的實現(xiàn)類有多種,根據(jù)具體的持久層框架的不同而不同;實現(xiàn)類:DataSourceTransactionManager、 HibernateTransactionManager、 JdoTransactionManager等107Spring事務管理Spring編程式事務:可以使用PlatformTransactionManager直接管理事務。簡單地通過一個bean引用給你的bean傳遞一個你使用的PlatformTransaction對象。然后,使用TransactionDefinition和TransactionStatus對象就可以發(fā)起、回滾、提交事務。流程一般如下:
1
.聲明數(shù)據(jù)源
2
.聲明一個事務管理類,例如DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等
3
.在我們的代碼中加入事務處理代碼108Spring事務管理Spring編程式事務://默認的事務屬性是PROPAGATION_REQUIRED屬性//初始化事務,參數(shù)定義事務的傳播類型TransactionDefinitiontdefinition=newDefaultTransactionDefinition();//獲取當前事務TransactionStatus
ts
=
transactionManager.getTransaction(td);
try{//邏輯處理語句
transactionMmit(ts);
}catch(Exception
e){
transactionManager.rollback(ts);
}
109Spring事務管理Spring編程式事務:
110Spring事務管理Spring編程式事務:
ApplicationContext.xml111Spring事務管理
Spring聲明式事務:Spring為聲明式事務提供了簡單而強大的支持,所謂聲明式事務,是指在Spring的配置文件中使用相應的標簽對事務進行配置,這樣做的好處是Spring可以幫助我們管理事務,例如:什么時候提交事務、什么時候回滾事務等。從開發(fā)效率與易維護的角度來看,Spring聲明式事務管理是實際開發(fā)中比較常用的。112Spring事務管理
Spring聲明式事務:實現(xiàn)方式:基于TransactionInterceptor的聲明式事務管理基于
TransactionProxyFactoryBean
的聲明式事務管理基于<tx>命名空間的聲明式事務管理基于
@Transactional的聲明式事務管理113Spring事務管理
Spring聲明式事務:基于<tx>命名空間的聲明式事務管理實現(xiàn)步驟在xml中啟用tx和aop兩個命名空間xmlns:tx=/schema/txxsi:schemaLocation="/schema/tx/schema/tx/spring-tx-5.0.xsd114Spring事務管理
Spring聲明式事務:基于<tx>命名空間的聲明式事務管理實現(xiàn)步驟在xml中配置通知、切入點以及Advisor115Spring事務管理
Spring聲明式事務:說明:<aop:config/>定義,它確保有tx:advice切面定義事務增強處理能力在合適的點被織入。116Spring事務管理事務的傳播方式:事務的傳播行為用于指定在多個事務方法間調(diào)用時,事務是如何在這些方法間傳播的,spring共支持7種傳播行為。PROPAGATION_REQUIRED
表示業(yè)務邏輯方法需要在一個事務中運行,如果該方法在運行時,已經(jīng)處在一個事務中,則直接加入到該事務中,否則自己創(chuàng)建一個新的事務。即:如果存在一個事務,則支持當前事務。如果沒有事務則開啟。(在實際開發(fā)中常用該傳播方式。)PROPAGATION_SUPPORTS
表示業(yè)務邏輯方法如果在某個事務范圍內(nèi)被調(diào)用,則該方法直接成為當前事務的一部分。如果該方法在事務范圍外被調(diào)用,則該方法在無事務的環(huán)境下執(zhí)行。即:如果存在一個事務,支持當前事務。如果沒有事務,則非事務的執(zhí)行。117Spring事務管理事務的傳播方式:PROPAGATION_MANDATORY
表示業(yè)務邏輯方法只能在一個已經(jīng)存在的事務中執(zhí)行,該方法不能創(chuàng)建自己的事務,如果該方法在沒有事務的環(huán)境下被調(diào)用,容器就會拋出事務不存在的異常。即:如果已經(jīng)存在一個事務,支持當前事務。如果沒有一個活動的事務,則拋出異常。PROPAGATION_REQUIRES_NEW
表示不管當前是否有事務存在,該業(yè)務邏輯方法都會為自己創(chuàng)建一個全新的事務。如果該方法已經(jīng)運行在一個事務中,則原有事務會被掛起,新的事務會被創(chuàng)建,直到該方法執(zhí)行結(jié)束后新事務才算結(jié)束,原先的事務再恢復執(zhí)行。即:總是開啟一個新的事務。如果一個事務已經(jīng)存在,則將這個存在的事務掛起,新事務運行完畢后,再接著運行被掛起的事務。118Spring事務管理PROPAGATION_NOT_SUPPORTED
表示業(yè)務邏輯方法不需要事務。如果該方法目前沒有關(guān)聯(lián)到某個事務,容器不會為它創(chuàng)建事務。如果該方法在一個事務中被調(diào)用,則該事務會被掛起,在方法調(diào)用結(jié)束后原先的事務才會恢復執(zhí)行。即:總是非事務地執(zhí)行,并掛起任何存在的事務,當前方法運行完畢后,被掛起的事務才恢復執(zhí)行。PROPAGATION_NEVER
表示業(yè)務邏輯方法絕對不能在事務范圍內(nèi)執(zhí)行。如果該方法在某個事務中執(zhí)行,容器會拋出異常,只有沒有關(guān)聯(lián)到任何事務時該方法才能正常執(zhí)行。即:總是非事務地執(zhí)行,如果存在一個活動事務,則拋出異常119Spring事務管理PROPAGATION_NESTED
表示如果一個活動的事務存在,業(yè)務邏輯方法則運行在一個嵌套的事務中,如果沒有活動事務,則按REQUIRED屬性執(zhí)行。它使用了一個單獨的事務,這個事務擁有多個可以回滾的保存點,內(nèi)部事務的回滾不會對外部事務造成影響,它只對DataSourceTransactionManager事務管理器生效。即:如果一個活動的事務存在,則運行在一個嵌套的事務中。如果沒有活動事務,則按TransactionDefinition.PROPAGATION_REQUIRED屬性執(zhí)行。120Spring事務管理--事務傳播方式圖示說
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物標志物在藥物安全性評價中的價值
- 生物標志物在藥物臨床試驗中的臨床意義
- 生物材料編程調(diào)控角膜再生的策略
- 生物支架引導的組織再生策略-1
- 生物化學虛擬實驗操作標準與規(guī)范制定
- 生物制劑失應答的炎癥性腸病個體化監(jiān)測指標
- 生物制劑與免疫抑制劑聯(lián)合方案
- 深度解析(2026)《GBT 20108-2017低溫單元式空調(diào)機》
- 康師傅人力資源專員筆試內(nèi)容大綱含答案
- 生活方式干預對IBD癌變風險的調(diào)控作用
- 2025年云南省人民檢察院聘用制書記員招聘(22人)筆試考試參考試題及答案解析
- 2025天津市第二批次工會社會工作者招聘41人考試筆試備考試題及答案解析
- 江西省三新協(xié)同體2025-2026年高一上12月地理試卷(含答案)
- 2025新疆維吾爾自治區(qū)哈密市法院、檢察院系統(tǒng)招聘聘用制書記員(31人)筆試考試參考試題及答案解析
- 空調(diào)安全知識培訓
- 2025重慶醫(yī)科大學附屬兒童醫(yī)院宜賓醫(yī)院招聘34人考試筆試備考題庫及答案解析
- 《醫(yī)學倫理》期末考試復習題庫(含答案)
- 原發(fā)性肝癌病人的護理原發(fā)性肝癌病人的護理
- 新能源有限公司光伏電站現(xiàn)場應急處置方案匯編
- 公路市政項目施工現(xiàn)場管理實施細則
- TSG11-2020 鍋爐安全技術(shù)規(guī)程
評論
0/150
提交評論