1、Spring簡述
Spring是一個分層的JavaSE/EEfull-stack(一站式)輕量級開源框架,Spring致力於提供一種方法管理你的業務對象,Spring的主要
目的是使JavaEE易用和促進好編程習慣,Spring致力於J2EE應用的各層的解決方案,而不是僅僅專一於某一層的方案,Spring貫穿表現
層、業務層及持久層。然而,Spring並不想取代那些已有的框架,而是與它們無縫地整合。
2、Spring體系結構
Spring框架是一個分層架構,它包含一系列的功能要素並被分爲大約20個模塊。這些模塊分爲Core Container、Data Access/Integration
Web、AOP(Aspect Oriented Programming)、Instrumentation和測試部分;web
(1)核心容器(Core Container)
1:Core和Beans模塊提供了Spring最基礎的功能,提供IOC 和依賴注入特性。這裏的基礎概念是BeanFactory,它提供對Factory
模式的經典實現來消除對程序性單例模式的須要,並真正地容許你從程序邏輯中分離出依賴關係和配置。
2:Context模塊基於 Core和 Beans來構建,它提供了用一種框架風格的方式來訪問對象,有些像JNDI註冊表。Context封裝包繼
承了 beans 包的功能,還增長了國際化(I18N),事件傳播,資源裝載,以及透明建立上下文,例如經過servlet容器,以及對大量
JavaEE特性的支持,如 EJB、JMX。核心接口是ApplicationContext。
3:Expression Language,表達式語言模塊,提供了在運行期間查詢和操做對象圖的強大能力。支持訪問和修改屬性值,方法調
用,支持訪問及修改數組、容器和索引器,命名變量,支持算數和邏輯運算,支持從Spring容器獲取Bean,它也支持列表投影、選
擇和通常的列表聚合等。
(2)數據訪問/ 集成部分(Data Access/Integration)
1:JDBC模塊,提供對JDBC的抽象,它可消除冗長的JDBC編碼和解析數據庫廠商特有的錯誤代碼。
2:ORM模塊,提供了經常使用的"對象/關係"映射API的集成層。 其中包括JPA、JDO、Hibernate和iBatis 。利用ORM封裝包,能夠混
合使用全部Spring提供的特性進行"對象/關係"映射,如簡單聲明性 事務管理 。
3:OXM模塊,提供一個支持Object和XML進行映射的抽象層,其中包括JAXB、Castor、XMLBeans、JiBX 和 XStream。
4:JMS模塊,提供一套"消息生產者、消費者"模板用於更加簡單的使用 JMS,JMS 用於在兩個應用程序之間,或分佈式系統中發
送消息,進行異步通訊。
5:Transaction模塊,支持程序經過簡單聲明性事務管理,只要是Spring管理對象都能獲得Spring管理事務的好處,即便是POJO,
也能夠爲他們提供事務。
(3)Web
1:Web-Socket模塊,WebSocket protocol是HTML5一種新的協議。它實現了瀏覽器與服務器全雙工通訊,spring支持webSocket通訊。
2:Web模塊,提供了基礎的web功能。例如多文件上傳、集成IOC容器、遠程過程訪問、以及Web Service支持,並提供一個
RestTemplate類來提供方便的Restful services訪問
3:Web-Servlet模塊,提供了Web應用的Model-View-ControllerMVC)實現。Spring MVC框架提供了基於註解的請求資源注入、更
簡單的數據綁定、數據驗證等及一套很是易用的JSP標籤,徹底無縫與Spring其餘技術協做。
4: Web-Portlet模塊,提供了在Portlet環境下的MVC實現。
(4)AOP
1:AOP模塊,提供了符合AOP聯盟規範的面向方面的編程實現,讓你能夠定義如方法攔截器和切入點,從邏輯上講,能夠減弱代碼
的功能耦合,清晰的被分離開。並且利用源碼級的元數據功能,還能夠將各類行爲信息合併到你的代碼中 。
2:Aspects模塊,提供了對AspectJ的集成。
3:Instrumentation模塊, 提供一些類級的工具支持和ClassLoader級的實現,能夠在一些特定的應用服務器中使用。
(5)Test
Test模塊,提供對使用JUnit和TestNG來測試Spring組件的支持,它提供一致的ApplicationContexts並緩存這些上下文,它還能
提供一些mock對象,使得你能夠獨立的測試代碼。
3、Spring的優勢
方便解耦,簡化開發
Spring就是一個大工廠,能夠將全部對象建立和依賴關係維護,交給Spring管理;
AOP 編程的支持
Spring提供面向切面編程,能夠方便的實現對程序進行權限攔截、運行監控等功能
聲明式事務的支持
只須要經過配置就能夠完成對事務的管理,而無需手動編程
方便程序的測試
Spring對Junit4支持,能夠經過註解方便的測試Spring程序方便集成各類優秀框架Spring不排斥各類優秀的開源框架,其內部
提供了對各類優秀框架(如:Struts、Hibernate、MyBatis、Quartz 等)的直接支持;
下降JavaEE API的使用難度
Spring對 JavaEE開發中很是難用的一些API(JDBC、JavaMail、遠程調用等),都提供了封裝,使這些API應用難度大大下降。
4、ApplicationContext文件與BeanFactory類正則表達式
1. ApplicationContext它是擴展BeanFactory接口;
2. BeanFactory它採起延遲加載的方案,只有真正在getBean時纔會實例化Bean在開發中咱們通常使用的是 ApplicationContext,
真正使用的是其實現類,FileSystemXmlAppliCationContext根據文件路徑獲取,ClassPathXmlApplicationContext 根據類路徑獲
取;
3. AppliCationContext它會在配置文件加載時,就會初始化Bean而且ApplicationContext它提供不一樣的應用層的Context實現。
5、Bean的做用域
在bean聲明時它有一個scope(做用域)屬性,它是用於描述bean的做用域。
可取值有:
singleton:單例 表明在spring ioc容器中只有一個Bean實例(默認的scope)
prototype 多例 每一次從spring容器中獲取時,都會返回一個新的實例
request 用在web開發中,將bean對象request.setAttribute()存儲到request域中
session 用在web開發中,將bean對象session.setAttribute()存儲到session域中
在開如經常使用的值是singleton與prototype。
6、Bean的生命週期spring
1. instantiate bean 對象實例化;
2. populate properties 封裝屬性;
3. 若是 Bean 實現 BeanNameAware 執行 setBeanName;
4. 若是 Bean 實現 BeanFactoryAwar 或 ApplicationContextAwar 設置工廠 setBeanFactory 或上;
下文對象 setApplicationContext;
5. 若是存在類實現 BeanPostProcess(後處理 Bean),執行 postProcessBeforeInitialization;
6. 若是 Bean 實現 InitializingBean 執行 afterPropertiesSet;
7. 調用自定義的 init-method 方法;
8. 若是存在類實現 BeanPostProcessor(處理 Bean),執行 postProcessAfterInitialization;
9. 執行業務處理;
10. 若是 Bean 實現 DisposableBean 執行 destroy;
11. 調用自定義的 destroy-method;
7、AOP
1. 簡述
AOP(面向切面編程)經過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是(面向對象編程)的延續,
是軟件是Spring框架中的一個重要內容,是函數式編程的一種衍生範型。利用AOP能夠對業務邏輯的各個部分進行隔離,從而使
得業務邏輯各部分之間的耦合度下降,提升程序的可重用性,同時提升了開發的效率。
AOP是一個概念,並無設定具體語言的實現,它能克服那些只有單繼承特性語言的缺點,spring2.0以後整合AspectJ第三
方AOP技術。AspectJ是一個面向切面的框架,它擴展了Java語言。AspectJ定義了AOP語法因此它有一個專門的編譯器用來生成遵
守Java字節編碼規範的Class文件。
1.1 主要功能
日誌記錄,性能統計,安全控制,事務處理,異常處理等等
1.2 主要意圖
將日誌記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中劃分出來,經過對這些行爲的分離,我
們但願能夠將它們獨立到非指導業務邏輯的方法中,進而改變這些行爲的時候不影響業務邏輯的代碼。
2. AOP與OOP區別
OOP針對業務處理過程的實體及其屬性和行爲進行抽象封裝,以得到更加清晰高效的邏輯單元劃分。而AOP則是針對業務處理過
程中的切面進行提取,它所面對的是處理過程當中的某個步驟或階段,以得到邏輯過程當中各部分之間低耦合性的隔離效果。這兩種
設計思想在目標上有着本質的差別。
3. 相關術語
3.1 目標對象(target)
指的是須要被加強的對象,因爲aop是經過代理模式實現,從而這個對象永遠是被代理對象。
3.2 鏈接點(join point)
所謂鏈接點是指那些被攔截到的點,在spring中這些點指的是方法,spring只支持方法類型的鏈接點。
3.3 切入點(pointcut)
表示一組joint point,這些joint point或是經過邏輯關係組合起來,或是經過通配、正則表達式等方式集中起來,它定
義了相應的Advice將要發生的地方簡單說切入點是指咱們要對哪些鏈接點進行攔截的定義。
3.4 通知(advice)
所謂通知是指攔截到鏈接點以後所要作的事情就是通知,通知分爲前置通知,後置通知,異常通知,最終通知,環繞通知
Advice定義了在pointcut裏面定義的程序點具體要作的操做。
3.5 引介(introduction)
引介是一種特殊的通知,在不修改類代碼的前提下,introduction能夠在運行期爲類動態地添加一些方法或屬性。
3.6 切面(aspect)
是切入點和通知的結合。
3.7 織入(weaving)
織入是一個過程,是將切面應用到目標對象從而建立出AOP代理對象的過程,織入能夠在編譯期,類裝載期,運行期進行。
Spring採用動態織入,而aspectj採用靜態織入。
3.8 代理(Proxy)
一個類被AOP織入加強後,就產生一個結果代理類。
4.AOP的動態代理
AOP的底層實現就是動態代理,通常AOP分爲靜態AOP和動態AOP。靜態AOP是指AspectJ實現的AOP,他是將切面代碼直接編譯到
Java類文件中。動態 AOP是指將切面代碼進行動態織入實現的AOP。Spring的AOP爲動態AOP,實現的技術爲:JDK提供的動態代理
技術和CGLIB(動態字節碼加強技術)。
4.1 JDK動態代理
在JVM運行時,內部動態生成class字節碼對象(即Class 對象),注:JDK動態代理只針對於接口操做。
4.2 CGLIB動態代理
CGLIB是一個開源項目是一個高性能,高質量的Code生成類庫,它能夠在運行期擴展Java類與實現Java接口。CGLIB包的底
層是經過使用一個小而快的字節碼處理框架ASM,來轉換字節碼並生成新的類,單獨使用CGLIB,那麼須要導入CGLIB的jar包還
須要一個asm相關jar包,可是spring框架的spring-core.jar 包中已經集成了CGLIB與asm。
注意:JDK動態代理只能夠爲接口去完成操做,而CGLIB動態代理能夠爲沒有實現接口的類去作代理,也能夠爲實現接口的類
去作代理。CGLIB動態代理它能夠爲沒有實現接口的類作代理,也能夠爲接口類作代理。
若是目標對象,有接口,優先使用:JDK動態代理只,若是目標對象,無接口,使用CGLIB動態代理。
5.AOP的傳統編程
在傳統的Spring AOP開發中它支持加強(advice)有五種:
1. 前置通知 目標方法執行前加強org.springframework.aop.MethodBeforeAdvice;
2. 後置通知 目標方法執行後加強org.springframework.aop.AfterReturningAdvice;
3. 環繞通知 目標方法執行先後進行加強org.aopalliance.intercept.MethodInterceptor;
4. 異常拋出通知 目標方法拋出異常後的加強org.springframework.aop.ThrowsAdvice;
5. 引介通知 在目標類中添加一些新的方法或屬性org.springframework.aop.IntroductionInterceptor;
6.Spring 整合aspectj框架實現AOP
Aspect:切面 =切點+通知(多個切點與多個通知的組合)
AspectJ它是一個第三方框架,spring 從 2.0 後可使用 aspectJ 框架的部分語法。
AspectJ框架它定義的通知類型有六種:
1. 前置通知 Before至關於BeforeAdvice;
2. 後置通知 AfterReturning至關於AfterReturningAdvice;
3. 環繞通知 Around至關於MethodInterceptor;
4. 拋出通知 AfterThrowing至關於ThrowAdvice;
5. 引介通知 DeclareParents至關於IntroductionInterceptor;
6. 最終通知 After不論是否異常,該通知都會執行,相比Spring的傳統AOP Advice多了一個最終通知。
8、Spring的事務管理
Spring的事務管理的四個優勢:
1. 提供一致的對於不一樣的事務管理的 API;
2. 支持聲明式事務管理;
3. 編程事務管理;
4. 優秀的整合與Spring的數據訪問:
Spring的事務管理主要提供了三個接口來完成:
1. org.springframework.transaction.PlatformTransactionManager
這是一個事務管理器,能夠來選擇相關的平臺(jdbc hibernate jpa…)
2. TransactionDefinition
它定義事務的一些相關信息 例如:隔離、傳播、超時、只讀
3. TransactionStatus
(1)PlatformTransactionManager
平臺事務管理器,在不一樣的持久化層解決技術它的事務代碼不同。
JDBC 開發
sql
Connection con=……; con.setAutoCommit(false);//開啓事務 con.rollback(); con.commit();
Hibernate 開發
數據庫
Session session=….; Transaction t=session.beginTransaction(); t.commit(); t.rollback();
PlatformTransactionManager 接口API
DataSourceTransactionManager 主要針對於JdbcTemplate開發MyBatis開發;
HibernateTransactionManasger 主要針對於Hibernate開發;
JpaTransactionManager 主要針對於JPA開發。
(2)TransactionDefinition
它描述的是事務的定義信息,在TransactionDefinition中定義了大量的常量。
8.1 隔離
事務的四個特性:ACID原子性、一致性、隔離性、持久性。
髒讀,不可重複讀 虛讀。
ISOLATION_DEFUALT 它使用後端數據庫的默認隔離級別(spring 中選項)
ISOLATION_READ_UNCOMMITTED 不能解決問題,會發生髒讀 不可重複讀 虛讀
ISOLATION_READ_COMMITTED 能夠解決髒讀 會產生不可重複讀與虛讀。
ISOLATION_REPEATABLE_READ 能夠解決髒讀,不可重複讀 解決不了虛讀
ISOLATION_SERIALIZABLE 串行化,能夠解決全部問題
對於不現的數據庫,它的底層默認事務隔離級別不同。
Oracle 數據庫它默認的是 read_committed
Mysql 數據庫它默認的是 repeatable_read.
8.2 超時
默認值是-1它使用的是數據庫默認的超時時間。
8.3 只讀
它的值有兩個true/false,若是選擇true通常是在select操做時
8.4 傳播
解決的是兩個被事務管理的方法互相調用問題。它與數據庫不要緊,是程序內部維護的問題。其中:
PROPAGATION_REQUIRED 默認值 兩個操做處於同一個事務,若是以前沒有事務,新建一個事務;
PROPAGATION_REQUIRES_NEW兩個操做處於不一樣的事務;
PROPAGATION_NESTED是一種嵌套事務,它是使用 SavePoint 來實現的。事務回滾時能夠回滾到指定的savepoint,
注意:它只對DataSourceTransactionManager有做用;
PROPAGATION_SUPPORTS 支持當前事務,若是不存在,就不使用事務;
PROPAGATION_MANDATORY 支持當前事務,若是不存在,拋出異常;
PROPAGATION_NOT_SUPPORTED 以非事務運行,若是有事務存在,掛起當前事務;
PROPAGATION_NEVER 以非事務運行,若是有事務存在,拋出異常;
8.5 TransactionStatus
定義了事務狀態信息,在事務運行過程當中,獲得某個時間點的狀態。
8.6 聲明式事務管理
(1)事務管理方式
1. 編碼方案 不建議使用,它具備侵入性。在原有的業務代碼基礎上去添加事務管理代碼。
2. 聲明式事務控制,基於 AOP 對目標進行代理,添加 around 環繞通知。
這種方案,它不具備侵入性,不須要修改原來的業務代碼
(2)基於xml配置聲明式事務管理方案
第一步:在applicationContext.xml文件中添加aop與tx的名稱空間
第二步:在applicationContext.xml件中配置
Spring提供的advice是傳統的 spring advice
1. 聲明事務管理器
2. 配置通知
Spring爲咱們提供了一個ransactionInterceptor來完成加強對於這個加強,咱們可使用spring爲咱們提供的一個標籤
<tx:advice>來完成操做
3. 配置切面
由於使用的是傳統的Spring的Advice,須要使用<aop:advisor>。
(3)基於Annotation聲明式事務管理方案
可使用@Transaction來在類或方法上添加聲明式事務管理。
注意:須要在 applicationContext.xml 文件中使用至關於開啓註解事務控制。編程