Spring核心詳解!!!
Spring出現的原因?
Spring出現的原因 解除耦合
軟體開發的開閉原則:通過多态實作,要麼子類重寫父類,要麼增加方法
提高抽象層次;
提高抽象層次的方法
把子類對象賦給父類對象進行使用的動态多态
注入Injection:某一個類想要什屬性,通過set方法給他 就叫注入
依賴注入 Depenency Injection =DI 有set就能活 沒有就錯誤
配置檔案(反射)
Spring如何解除耦合
解耦合:首先解除邏輯耦合
mvc模式第一次解除了邏輯耦合
spring的IOC是進行深度解耦
日志:用來保持程式的健壯性,就是程式的運作記錄
代理需要在jdk1.5以上版本使用
jdk代理是基于反射的沒有反射就沒有辦法通用
調用代理類的的任何方法,都會執行到invoke方法
代理是模式
代理機制其實真正的代理的是方法
代理:proxy
代理的本質就是原産品不動,不做任何改變
要增值
要包裝
代理分類:
一.靜态代理:門面模式或裝飾模式
缺點:需要為每一個被代理的方法都寫一個代理方法,修改的時候特别值複雜,不靈活
二.動态代理
1.jdk動态代理:缺點:要想代理對象,被代理對象必須有接口,否側不能代理
2.CGLIB代理:優點:在被代理類沒有接口的情況下也能夠被代理,實際就是為目前類生成一個子類
代理類和被代理類都需要實作同一個接口,代理類中包含一個被代理類的對象,可以提供兩種方式把被代理對象賦給代理對象
調用被代理類,實作真正的邏輯,在自己的裡面實作額外邏輯.
代理最終的要求就是簡單通用靈活
Spring核心(重點來了!!!!)
Spring是一個無侵入式的輕量級開源架構
Spring兩大特性 :
1.IOC:控制反轉
IOC作用:解除類與類之間的關系耦合
解除耦合的方式用了四個技術點:
- 配置
- 容器
- 反射
- 注入(DI):利用set方法或者構造器給屬性指派
2.AOP:面相切面程式設計
作用:為了解除業務邏輯耦合,例如耦合或者資料業務邏輯日志業務
AOP實作原理是基于代理的
Spring進行内部實作的時候 ,會檢測是否存在接口,存在時選擇jdk動态代理,不存在選擇CGLIB代理
Spring類似一個管家,後期幾乎所有内容都交給Spring管理,View層Spring不管理,與java相關的全部管理.(Spring容器)
Spring的核心思想是解除程式中的耦合(解除了業務邏輯耦合,解除了類與類之間的關系耦合)
輕量級與重量級的區分:
1.性能開銷
2.架構本身的大小問題
3.使用的難易程度
Spring中所有的行為都是基于Spring能夠管理所有的類
Spring也有持久層架構,但是因為性能不強,是以沒有人用,用來給hibernate和mybitas支援
Spring對web架構也是有支援的
Spring還是一個mvc結構的架構
Core解除的是類級别的耦合
AOP解除的是方法級别的耦合
IOC控制反轉 Inversion Of Control
高層子產品不應該依賴底層子產品(如Action依賴Dao層)
實作必須依賴抽象,而不是是抽象依賴實作
依賴注入:Dependency Injection
DI是IOC的核心實作原理
通俗的說就是利用set方法或者構造器給屬性指派
搭建Spring環境:
1.加入jar包
2.寫配置檔案:applicationContext.xml 必須放在Src下 可以更改名字一般叫Spring.xml
一個Spring可以對應多個XMl檔案,配置檔案的劃分是根據業務邏輯劃分的
跟标簽裡寫東西是Schema
Spring的核心是一個context容器
想要什麼對象就在spring中配置這個對象
Spring會自動建立對象并且進行初始化
注入類型分為三類:
Type1 侵入式(依賴Spring)
Type2 (set/get) 和type3(構造器注入)是非侵入式
Spring中的接口是為了提高抽象層次,是變量接收的一個中介,是以Srping不需要管理接口
所謂的元件就是可以直接執行個體化,可以直接用的
構造器注入 裡面的屬性 ref=references引用 index要指派屬性的下标,從0開始
構造器注入唯一的優點就是時效性好,建立對象時直接指派.
構造器注入作為了解 不需要掌握
構造器和set/get方法同時存在時取決于set/get方法
命名空間的引入和标簽的引入差不多,不引用就不能用
當要注入的元件隻有一個類型,注解後可以不配置,當有多個同一類型元件時,注解必須手動指定比對的對象.
使用annotation注入就是為了0配置,resource自動配置屬性,這是spring第一次使用0配置
0配置就是使用annotation的方式替代xml中配置的方式都叫0配置
使用Aop是最終使用annotation方式
Aspect Oriented Programming面向切面程式設計
切面就是系統服務邏輯
AOP的實作種類
1.實作Spring API的傳統模式 侵入式實作已經淘汰(spring提倡無侵入式程式設計)
2.基于xml的設定
3.基于annotation配置
如上:
隻要想寫切點,必然要寫 pointcut="execytion( * 包名+類名. * (…))"第一個 * 指任意傳回值類型 第二個 * 表示所有方法 …表示任意參數
AOP基于代理的
最最最最常見的注解
事務是什麼??
事物Transaction: 就是一件完整的事情:由一條或者多條sql語句組成,要麼全部執行成功,要麼全部執行失敗.
例如(增删改,或者查詢時加了for update 為了加上鎖定事物,意思就是我操作完成後,别人才能操作目前對象)
事物的特點:1.最小單元—原子性(不可再分割)
例如:必須有兩條sql語句才能完成一次删除部門的操作;
2.一緻性
例如:資料改變之前的狀态和改變之後的狀态一緻;
3.持久性
例如:資料修改完畢後應該是一個持久狀态存在資料庫中,而不是臨時的;
4.隔離性(當一個事物占用某一個資源的時候,其餘的事物隻能進行等待,等待釋放對于資源的占用)