spring筆記

 
第一部分:spring概述
 
1.1 從整體上來說(概述)
我們常說的Spring其實指的是Spring FrameWork(Spring框架),Spring是分層的full-stack(全棧)輕量級開源框架,以IOC和AOP為內核,提供了展現層springMVC和業務層事務管理等眾多的企業級應用技術,還能整合開源的第三方框架和類庫。
 
1.2 Spring優勢
整個Spring的優勢,傳達出一個訊號,Spring是一個綜合的,且有很強的思想性框架,每學習一天,就能體會到它的一些優勢。
0
 
1.3 Spring的核心結構
Spring包括以下幾個大模組:
  • Spring核心容器Core Container:它管理Spring應用中bean的創建、配置和管理,所有Spring模組都構建與核心容器之上。
  • 面向切面編程AOP/Aspects
  • 數據訪問Data Access
  • web
  • test
 
0
 
第二部分:Spring的核心思想
 
2.1 IOC
 
2.1.1 什麼是IOC
IOC(Inversion of control)控制反轉,是一種技術思想。
解決java領域對象的創建,管理所造成的對象之間的耦合問題。在IOC思想下開發,不需要再去顯示的new對象了,而是由IOC容器幫助我們實例化對象並且管理它,我們需要哪個對象,就去問IOC容器要即可。
 
2.1.2 IOC和DI的區別
DI(Dependency Injection)依賴注入
IOC和DI描述的是同一件事情,只不過角度不同罷了:
IOC是站在對象的角度,對象的實例化和管理的權利交給了(反轉給了)容器
DI是站在容器的角度,容器會把對象依賴的其它對象注入
 
2.2 AOP
 
2.2.1 什麼是AOP
AOP(Aspect oriented Programming)面向切面編程
AOP是OOP的延續(封裝,繼承,多態)
 
2.2.2 AOP解決什麼問題
AOP解決了在不改變原有程式碼邏輯的基礎上,增強橫切程式碼邏輯,根本上解耦合,避免橫切程式碼重複。
 
第三部分:手寫IOC和AOP
 
3.1 new創建對象的問題
實例化對象除了new之外,還有反射技術!Class.forName(“全限定類名”),可把全限定類名配置在xml中。
另外,使用工廠模式通過反射技術生產對象,工廠模式是解耦合非常好的一種模式。
3.2 service層事務控制問題
資料庫事務歸根結底是Connection的事務:connection.commit()提交事務;connection.rollback()回滾事務。
開啟事務就是關閉Connection的自動提交connection.autoCommit(false);
讓多次更新操作使用同一個connection連接,並且在同一個執行緒內執行(我們可以給當前執行緒ThreadLocal綁定一個connection,和當前執行緒有關係的資料庫操作都會使用這個connection)
(第一次使用連接,發現當前執行緒沒有,從連接池獲取一個連接綁定到當前執行緒)
 
3.3 用到的設計模式
3.3.1 工廠模式(BeanFactory使用反射技術創建對象)
1)簡單工廠模式(靜態工廠/實例工廠):根據不同的傳參創建不同的對象
使用場景:1.當客戶程式不需要知道要使用對象的創建過程;2)客戶程式使用的對象存在變動的可能,或者根本就不知道要使用哪一個具體的對象。
2)工廠方法:一個工廠只創建一個對應的對象
3.3.2 單例模式(獲取當前執行緒的資料庫連接,事務管理類等)
私有化構造方法,提供對外獲取實例的靜態介面
1)餓漢式
2)懶漢式(加synchronized關鍵字進行同步)
3.3.3 代理模式(主要用於增強邏輯,如事務邏輯)
1)靜態代理:每個委託對象會對應一個實實在在的代理類
2)動態代理:不需要為每個委託對象都創建一個代理類
分為JDK動態代理:委託對象必須要實現介面
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[]
args) throws Throwable {
method.invoke(target,args);
}
});
Cglib動態代理(需要引入第三方jar包):委託對象不需要實現介面
Enhancer.create()
 
3.4 ThreadLocal關鍵字
它代表一個執行緒局部變數,通過把數據放在ThreadLocal中就可以讓每個執行緒創建一個該變數的副本,
從而避免並發訪問的執行緒安全問題。
 
 
第四部分:Spring IOC應用
 
4.1 Spring IOC基礎
4.1.1 BeanFactory和ApplicationContext區別
BeanFactory(IOC容器的基礎介面):通過反射技術實例化對象並維護對象之間的關係
ApplicationContext(IOC容器的高級介面)基於xml和註解的三個常用實現類:
ClassPathXmlApplicationContext;FileSystemXmlApplicationContext;AnnotationConfigApplicationContext
 
4.1.2 啟動 IoC 容器的方式:
1)java環境下啟動IOC容器(3種)
ClassPathXmlApplicationContext;FileSystemXmlApplicationContext;AnnotationConfigApplicationContext
2)web環境下啟動IOC容器:ContextLoaderListener(監聽器載入xml或註解配置類)
告訴ContextloaderListener知道我們使⽤註解的⽅式啟動ioc容器–>
 
contextClass
org.springframework.web.context.support.AnnotationConfigWebAppli
cationContext
 
 
4.1.3 實例化bean的三種方式:
1)使用無參構造方法;2)使用靜態方法創建;3)使用實例化方法創建
 
4.1.4 Bean的作用範圍及生命周期
在Spring框架管理Bean對象的創建時,Bean對象默認都是單例的
 
作用範圍:
單例Singleton:當創建容器時,對象就被創建了,單例模式的生命周期與容器相同
多例(原型)模式:當使用對象時,創建新的對象實例,只要對象在使用中,就一直活著,當對象長時間不用時,被java的垃圾回收器回收了;
多例模式下的bean對象,spring框架只負責創建,不負責銷毀。
 
4.1.5 純註解模式
0
0
 
0
 
4.2 IOC高級特性
4.2.1 延遲載入lazy-init
bean對象創建的延遲載入
普通bean的初始化是在容器啟動初始化階段執行的,而被lazy-init=true修飾的bean則是從容器里第一次執行context.gteBean()時進行觸發。
Spring 啟動的時候會把所有bean資訊(包括XML和註解)解 析轉化成Spring能夠識別的BeanDefinition並存到Hashmap里供下面的初始化時用,然後對每個 BeanDefinition 進行處理,如果是懶載入的則在容器初始化階段不處理,其他的則在容器初始化階段進 行初始化並依賴注入。
0
 
4.2.2 FactoryBean 和 BeanFactory
spring中有兩種bean,一個普通bean,一個工廠bean
factoryBean可以生成某一個類型的bean實例,藉助於它實現自定義bean的過程,應用於複雜對象的創建
 
測試,獲取FactoryBean,需要在id之前添加「&」
 
4.2.3 後置處理器
spring提供了兩種後處理bean的介面:BeanPostProcessor和BeanFactoryPostProcessor
工廠初始化(BeanFactory)—> Bean對象 在BeanFactory初始化之後可以使用BeanFactoryPostProcessor進⾏後置處理做⼀些事情 在Bean對象實例化(並不是Bean的整個⽣命周期完成)之後可以使⽤BeanPostProcessor進⾏後置處 理做⼀些事情 注意:對象不⼀定是springbean,⽽springbean⼀定是個對象
 
0
 
0
Spring啟動過程過程中,會把Bean解析成Spring內部的BeanDefinition
注意:調⽤ BeanFactoryPostProcessor ⽅法時,這時候bean還沒有實例化,此時 bean 剛被解析成 BeanDefinition對象
 
4.2.4 IOC循環依賴問題
循環依賴其實就是循環引用,也就是兩個或兩個以上的bean相互引用對方,形成閉環。
Spring中循環依賴場景:
1)構造器的循環依賴(構造器注入)
2)Filed屬性的循環依賴(set注入)
其中,構造器的循環依賴問題無法解決,只能拋出BeanCurrentlyInCreationException異常,
在解決屬性循環依賴時,Spring採用的是提前暴露對象的方法。
0
總結:Spring 不支援原型 bean 的循環依賴。
 
0
0
 
 
第五部分:Spring源碼分析
5.1 IOC容器初始化過程
下⾯我們以 ClasspathXmlApplicationContext 為例,深⼊源碼說明 IoC 容器的初始化流程
Spring IoC 容器初始化的關鍵環節就在 AbstractApplicationContext#refresh() ⽅法中
我們查看 refresh ⽅法來俯瞰容器創建的主體流程
Spring IoC容器初始化主流程如下:
0
0
0
 
0
 
0
第六部分:AOP應用
 
6.1 AOP術語
JoinPoint連接點:指方法開始、結束、異常、正常運行完畢等這些特殊的時機點(候選點)
PointCut切入點:指AOP要影響的方法
Advice通知/增強:提供增強功能的方法:前置通知、後置通知、異常通知、最終通知、環繞通知
Target目標對象:被代理對象
Proxy:代理對象
Weaving織入:把增強應用到目標對象創建新的代理對象的過程
Aspect切面:增強程式碼所關注的方法,把增強程式碼定義到一個類中,這個類就是切面類。
 
6.2 AOP代理選擇
0
無論被代理對象是否實現介面,只要不是final修飾的類都可以採用cglib提供的方式創建代理對象
Cglib:基於子類的動態代理
 
6.3 Spring聲明式事務的支援
編程式事務:在業務程式碼中添加事務控制程式碼
聲明式事務:通過xml或者註解配置的方式達到事務控制的目的
 
6.3.1 事務的四大特性
原子性,一致性,隔離性,持久性
 
6.3.2 事務的四種隔離級別(解決事務並發問題)
不考慮隔離級別,會出現:臟讀(讀到未提交數據)、不可重複讀(讀到已提交的update數據)、虛讀(幻讀)(讀到已提交的insert或delete數據)
 
 
0
 
6.3.3 事務的傳播行為
A調用B,我們站在B的角度來觀察定義事務的傳播行為
1)Propagation_required(常用):如果當前沒有事務,就新建一個事務,如果已經存在一個事務中,加入到這個事務中。這是最常見的選擇。
2) Propagation_supports:支援當前事務,如果當前沒有事務,就以非事務方式執行。
3) Propagation_mandatory:使⽤當前的事務,如果當前沒有事務,就拋出異常。
4) Propagation_requires_new:新建事務,如果當前存在事務,把當前事務掛起。
5) Propagation_not_supported:以⾮事務⽅式執⾏操作,如果當前存在事務,就把當前事務掛起。
6) Propagation_never:以⾮事務⽅式執⾏,如果當前存在事務,則拋出異常。
7) Propagation_nested:如果當前存在事務,則在嵌套事務內執⾏。如果當前沒有事務,則執⾏與PROPAGATION_REQUIRED類似的操作。
 
@Transactional(readOnly = true,propagation = Propagation.SUPPORTS)
純註解方式:在 Spring 的配置類上添加 @EnableTransactionManagement 註解即可
 
第七部分:AOP源碼分析
 
 
 
 
 
 
 
 
Tags: