Spring核心知識
Spring是一個開源框架,Spring是於2003年興起的一個輕量級的Java開發框架,由Rod Johnson在其著作Expert One-On-One J2EE Development and Design中闡述的部分理念和原型衍生而來。它是為了解決企業應用開發的復雜性而創建的。框架的主要優勢之一就是其分層架構,分層架構允許使用者選擇使用哪一個組件,同時為J2EE應用程序開發提供集成的框架。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於服務器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。Spring的核心是控制反轉(IoC)和面向切面(AOP)。簡單來說,Spring是一個分層的JavaSE/EEfull-stack(一站式)輕量級開源框架。
為什么說Spring是一個一站式的輕量級開源框架呢?EE開發可分成三層架構,針對JavaEE的三層結構,每一層Spring都提供了不同的解決技術。
• WEB層:SpringMVC
• 業務層:Spring的IoC
• 持久層:Spring的JDBCTemplate(Spring的JDBC模板,ORM模板用於整合其他的持久層框架)
從上面的簡要介紹中,我們要知道Spring的核心有兩部分:
• IoC:控制反轉。
舉例來說,在之前的操作中,比方說有一個類,我們想要調用類里面的方法(不是靜態方法),就要創建類的對象,使用對象調用方法實現。對於Spring來說,Spring創建對象的過程,不是在代碼里面實現的,而是交給Spring來進行配置實現的。
AOP:面向切面編程。
SpringAOP原理
AOP編程技術
什么是AOP編程
AOP: Aspect Oriented Programming 面向切面編程。
面向切面編程(也叫面向方面):Aspect Oriented Programming(AOP),是目前軟件開發中的一個熱點。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
AOP是OOP的延續,是(Aspect Oriented Programming)的縮寫,意思是面向切面(方面)編程。
主要的功能是:日志記錄,性能統計,安全控制,事務處理,異常處理等等,解決代碼復用。
主要的意圖是:將日志記錄,性能統計,安全控制,事務處理,異常處理等代碼從業務邏輯代碼中划分出來,通過對這些行為的分離,我們希望可以將它們獨立到非指導業務邏輯的方法中,進而改 變這些行為的時候不影響業務邏輯的代碼。
可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。
假設把應用程序想成一個立體結構的話,OOP的利刃是縱向切入系統,把系統划分為很多個模塊(如:用戶模塊,文章模塊等等),而AOP的利刃是橫向切入系統,提取各個模塊可能都要重復操作的部分(如:權限檢查,日志記錄等等)。由此可見,AOP是OOP的一個有效補充。
注意:AOP不是一種技術,實際上是編程思想。凡是符合AOP思想的技術,都可以看成是AOP的實現。
Aop, aspect object programming 面向切面編程
功能: 讓關注點代碼與業務代碼分離!
關注點
關注點,重復代碼就叫做關注點;
切面
關注點形成的類,就叫切面(類)!
面向切面編程,就是指 對很多功能都有的重復的代碼抽取,再在運行的時候往業務方法上動態植入“切面類代碼”。
切入點
執行目標對象方法,動態植入切面代碼。
可以通過切入點表達式,指定攔截哪些類的哪些方法; 給指定的類在運行的時候植入切面類代碼。
AOP底層實現原理
靜態代理和動態代理
靜態代理需要生成目標代理對象,不推薦。
動態代理不需要生成目標代理對象的。
動態代理分為JDK動態代理、CGLIB動態代理。
代理設計模式
什么是代理模式
通過代理控制對象的訪問,可以詳細訪問某個對象的方法,在這個方法調用處理,或調用后處理。既(AOP微實現) ,AOP核心技術面向切面編程。
代理模式應用場景
SpringAOP、事物原理、日志打印、權限控制、遠程調用、安全代理 可以隱蔽真實角色
代理的分類
靜態代理(靜態定義代理類)
動態代理(動態生成代理類)
Jdk自帶動態代理
Cglib 、javaassist(字節碼操作庫)
靜態代理
什么是靜態代理
由程序員創建或工具生成代理類的源碼,再編譯代理類。所謂靜態也就是在程序運行前就已經存在代理類的字節碼文件,代理類和委托類的關系在運行前就確定了。
動態代理
什么是動態代理
1.代理對象,不需要實現接口
2.代理對象的生成,是利用JDK的API,動態的在內存中構建代理對象(需要我們指定創建代理對象/目標對象實現的接口的類型)
3.動態代理也叫做:JDK代理,接口代理
JDK動態代理
1)原理:是根據類加載器和接口創建代理類(此代理類是接口的實現類,所以必須使用接口 面向接口生成代理,位於java.lang.reflect包下)
2)實現方式:
1. 通過實現InvocationHandler接口創建自己的調用處理器 IvocationHandler handler = new InvocationHandlerImpl(…);
2. 通過為Proxy類指定ClassLoader對象和一組interface創建動態代理類Class clazz = Proxy.getProxyClass(classLoader,new Class[]{…});
3. 通過反射機制獲取動態代理類的構造函數,其參數類型是調用處理器接口類型Constructor constructor = clazz.getConstructor(new Class[]{InvocationHandler.class});
4. 通過構造函數創建代理類實例,此時需將調用處理器對象作為參數被傳入Interface Proxy = (Interface)constructor.newInstance(new Object[] (handler));
缺點:jdk動態代理,必須是面向接口,目標業務類必須實現接口
CGLIB動態代理
原理:利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理。
什么是CGLIB動態代理
使用cglib[Code Generation Library]實現動態代理,並不要求委托類必須實現接口,底層采用asm字節碼生成框架生成代理類的字節碼
CGLIB動態代理與JDK動態區別
java動態代理是利用反射機制生成一個實現代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。
而cglib動態代理是利用asm開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理。
Spring中。
1、如果目標對象實現了接口,默認情況下會采用JDK的動態代理實現AOP
2、如果目標對象實現了接口,可以強制使用CGLIB實現AOP
3、如果目標對象沒有實現了接口,必須采用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換
JDK動態代理只能對實現了接口的類生成代理,而不能針對類 。jdk需要接口,動態代理只需要子類實現,基於反射虛擬生成代理類。
CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法 。cglib是基於ASM字節碼技術虛擬生成代理類。
因為是繼承,所以該類或方法最好不要聲明成final ,final可以阻止繼承和多態。
AOP編程使用
注解版本實現AOP
@Aspect 指定一個類為切面類
@Pointcut("execution(* com.itmayiedu.service.UserService.add(..))") 指定切入點表達式
@Before("pointCut_()") 前置通知: 目標方法之前執行
@After("pointCut_()") 后置通知:目標方法之后執行(始終執行)
@AfterReturning("pointCut_()") 返回后通知: 執行方法結束前執行(異常不執行)
@AfterThrowing("pointCut_()") 異常通知: 出現異常時候執行
@Around("pointCut_()") 環繞通知: 環繞目標方法執行
AOP編程應用場景
日志記錄,性能統計,安全控制,事務處理,異常處理。
1.spring事務基於AOP環繞通知和異常通知實現的。
2.spring事務分為:編程式事務、聲明式事務。spring底層使用編程式事務+AOP技術進行包裝的=聲明式事務。
AOP作用:定義一個切入點,攔截切入點的方法,攔截到方法后,可以在方法之前或者之后進行處理。
作用:簡化重復代碼。
應用場景:事務底層實現、日志管理、權限控制等。