當前位置:首頁 » 編程軟體 » aop切面編程

aop切面編程

發布時間: 2022-05-28 07:53:46

『壹』 spring中的aop 是怎麼面向切面編程

Spring面向切面編程(AOP)

1 spring容器中bean特性


Spring容器的javabean對象默認是單例的。


通過在xml文件中,配置可以使用某些對象為多列。


Spring容器中的javabean對象默認是立即載入(立即實例化:spring載入完成,立即創建對象)


scope:屬性


singleton:默認值為單例,默認也是立即載入,在載入完成spring容器的時候,bean對象已經創建完成


prototype:多例的,默認懶載入,spring容器載入完成的時候,不會創建bean的對象,只有從容器獲得bean對象的時候,才進行bean對象的實例化


request: 將創建的javabean對象,封裝到request范圍


session:將創建的javabean對象,封裝到session范圍


Spring容器bean的對象生命周期:


Bean對象的創建一直到銷毀為bean的生命周期。


生命周期的開始:


如果為單例,由載入完spring容器開始


如果為多例,由從容器獲得bean對象開始


實例化


初始化


服務


銷毀(單例:關閉容器的時候,多例由jvm自動回收)


2 spring的AOP面向切面編程


2.1 模擬銀行轉賬業務


需求:實現銀行的轉賬功能,在轉賬的時候需要完成


1 身份認證(登陸)


2 許可權的驗證


3 轉賬實現


4 歷史交易記錄,


分析:1,2,4三個功能對於銀行的業務,屬於公共的功能(共性的功能)


在功能實現的時候,需要將1,2,4抽取出來,單獨實現,


做到了將共性的功能和核心的業務功能進行了分離


通過動態代理實現:共性的功能和核心業務功能的合並,產生核心業務對象的


在代碼實現的時候,進行了功能實現的分離:


代碼開發的進行分離,程序在運行的時候進行合並。


2.2 springAOP的思想


在系統開發中,將系統的共性的公共的功能獨立實現,在程序運行的過程中,將共性功能和核心的業務功能,進行整合。


好處:


1 完成共性功能和核心業務功能的解耦合


2 提供共性功能的復用性。


2.3springAOP的概念


Aspect切面:封裝共性功能的(增強功能的)類


Advice通過:切面類中封裝的增強功能的方法。


PointCut:切入點,是一個集合的概念,該集合的表達使用一個正則表達式表達


所有核心業務對象的所有方法的前後(事務處理AOP典型的應用)


JoinPoint:連接點,程序中需要加入advice的地方,而且正在執行的ponitCut


織入(Weaving):將aspect和核心業務對象,進行整合的過程。


3 springAOP的實現


3.1通過特定介面實現


Aop通知的類型:


Before:前置通知


After:後置通知


Around:環繞通知


Throwing:異常通知


需求:實現在業務對象中的方法執行的時候,記錄日誌功能


3.1.1前置通知

packageorg.guangsoft.utils;
importjava.lang.reflect.Method;
importjava.util.Arrays;
importjava.util.Date;
importorg.springframework.aop.MethodBeforeAdvice;
/****
*前置增強:
*MethodBeforeAdvice介面表示重寫的方法為前置advice
****/

{
@Override
publicvoidbefore(Methodmethod,
Object[]args,Objectobj)
throwsThrowable
{
System.out.println(method);
System.out.println(Arrays.toString(args));
System.out.println(obj);
System.out.println("BeforeLog-------------"+newDate());
}
}


AOP配置:

<?xmlversion="1.0"encoding="UTF-8"?>
<!--到入xml文件的約束-->
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
<!--實例化BeforeLog對象-->
<beanid="bf"class="org.guangsoft.utils.BeforeLog"></bean>
<!--實例化service對象-->
<beanid="us"class="org.guangsoft.service.impl.UsersServiceImpl"/>
<!--進行aop的配置,產生代理對象-->
<aop:config>
<!--聲明切入點-->
<aop:pointcutexpression="execution(*org.guansoft.service.impl.*.*(..))"
id="pc"/>
<!--織入將通知和切入點進行合並(切面+核心業務對象)-->
<aop:advisoradvice-ref="bf"pointcut-ref="pc"/>
</aop:config>
</beans>


3.1.2後置通知


對業務對象的方法進行後增強。

packageorg.guangsoft.utils;
importjava.lang.reflect.Method;
importjava.util.Date;
importorg.springframework.aop.AfterReturningAdvice;
/***
*後置通知
****/

{
@Override
publicvoidafterReturning(Objectobj1,//obj1接收目標方法的返回值
Methodmethod,
Object[]args,
Objectobj2)throwsThrowable
{
//System.out.println(obj1+"----------------------"+obj2);
System.out.println("AfterLog-------------------"+newDate());
}
}


AOP配置:

<?xmlversion="1.0"encoding="UTF-8"?>
<!--到入xml文件的約束-->
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.1.xsd">
<!--實例化BeforeLog對象-->
<beanid="bf"class="org.guangsoft.utils.BeforeLog"></bean>
<beanid="af"class="org.guangsoft.utils.AfterLog"></bean>
<!--實例化service對象-->
<beanid="us"class="org.guangsoft.service.impl.UsersServiceImpl"/>
<!--進行aop的配置,產生代理對象-->
<aop:config>
<!--聲明切入點-->
<aop:pointcutexpression="execution(*org.guangsoft.service.impl.*.*(..))"
id="pc"/>
<!--織入將通知和切入點進行合並(切面+核心業務對象)-->
<aop:advisoradvice-ref="bf"pointcut-ref="pc"/>
<aop:advisoradvice-ref="af"pointcut-ref="pc"/>
</aop:config>
</beans>


3.1.3環繞通知

packageorg.guangsoft.utils;
importjava.lang.reflect.Method;
importjava.util.Arrays;
importjava.util.Date;
importorg.aopalliance.intercept.MethodInterceptor;
importorg.aopalliance.intercept.MethodInvocation;
/***
*環繞通知
****/

{
/**
*MethodInvocation中封裝了目標對象,調用的方法,方法需要的參數
****/
@Override
publicObjectinvoke(MethodInvocationmi)throwsThrowable
{
Methodmethod=mi.getMethod();
Object[]args=mi.getArguments();
Objectobj=mi.getThis();
System.out.println(method);
System.out.println(Arrays.toString(args));
System.out.println(obj);
System.out.println("around------before--------"+newDate());
Objectrv=method.invoke(obj,args);//調用目標對象的方法,放行
System.out.println("around------after--------"+newDate());
returnrv;
}
}


AOP配置:同上


3.1.4 異常通知

packageorg.guangsoft.utils;
importjava.util.Date;
importorg.springframework.aop.ThrowsAdvice;
/****
*異常通知
***/

{
/***
*該類中的方法參考AfterReturningAdvice寫
*該參數是用來接收異常信息的
****/
publicvoidafterThrowing(Throwableex)throwsThrowable
{
//System.out.println(obj1+"----------------------"+obj2);
System.out.println("ExceptionLog-----------"+ex.getMessage()
+"--------"+newDate());
}
}

Pointcut:核心業務對象

Advice:通知

『貳』 什麼是面向切面編程AOP

面向切面編程(AOP是Aspect Oriented Program的首字母縮寫) ,我們知道,面向對象的特點是繼承、多態和封裝。而封裝就要求將功能分散到不同的對象中去,這在軟體設計中往往稱為職責分配。實際上也就是說,讓不同的類設計不同的方法。這樣代碼就分散到一個個的類中去了。這樣做的好處是降低了代碼的復雜程度,使類可重用。

但是人們也發現,在分散代碼的同時,也增加了代碼的重復性。什麼意思呢?比如說,我們在兩個類中,可能都需要在每個方法中做日誌。按面向對象的設計方法,我們就必須在兩個類的方法中都加入日誌的內容。也許他們是完全相同的,但就是因為面向對象的設計讓類與類之間無法聯系,而不能將這些重復的代碼統一起來。
也許有人會說,那好辦啊,我們可以將這段代碼寫在一個獨立的類獨立的方法里,然後再在這兩個類中調用。但是,這樣一來,這兩個類跟我們上面提到的獨立的類就有耦合了,它的改變會影響這兩個類。那麼,有沒有什麼辦法,能讓我們在需要的時候,隨意地加入代碼呢?這種在運行時,動態地將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面的編程。
一般而言,我們管切入到指定類指定方法的代碼片段稱為切面,而切入到哪些類、哪些方法則叫切入點。有了AOP,我們就可以把幾個類共有的代碼,抽取到一個切片中,等到需要時再切入對象中去,從而改變其原有的行為。
這樣看來,AOP其實只是OOP的補充而已。OOP從橫向上區分出一個個的類來,而AOP則從縱向上向對象中加入特定的代碼。有了AOP,OOP變得立體了。如果加上時間維度,AOP使OOP由原來的二維變為三維了,由平面變成立體了。從技術上來說,AOP基本上是通過代理機制實現的。
AOP在編程歷史上可以說是里程碑式的,對OOP編程是一種十分有益的補充。

『叄』 Java編程中的AOP和IOC分別是什麼呢,什麼時候用呢

控制反轉(IOC)


(理解好Ioc的關鍵是要明確「誰控制誰,控制什麼,為何是反轉(有反轉就應該有正轉了),哪些方面反轉了」)

1、Ioc—Inversion of Control:即「控制反轉」,不是什麼技術,而是一種設計思想。在Java開發中,Ioc意味著將你設計好的對象交給容器控制,而不是傳統的在你的對象內部直接控制。

2、誰控制誰,控制什麼:傳統Java SE程序設計,我們直接在對象內部通過new進行創建對象,是程序主動去創建依賴對象;而IoC是有專門一個容器來創建這些對象即由Ioc容器來控制對象的創建。

誰控制誰?當然是IoC 容器控制了對象。

控制什麼?那就是主要控制了外部資源獲取(不只是對象包括比如文件等)。

3、為何是反轉,哪些方面反轉了: 有反轉就有正轉,傳統應用程序是由我們自己在對象中主動控制去直接獲取依賴對象,也就是正轉;而反轉則是由容器來幫忙創建及注入依賴對象。

為何是反轉?因為由容器幫我們查找及注入依賴對象,對象只是被動的接受依賴對象,所以是反轉。

哪些方面反轉了?依賴對象的獲取被反轉了。

還是不明白沒事,下面搞個簡單案例來說就懂啦 !!!

例子:當我們在任何一個有實際開發意義的程序項目中,我們會使用很多類來描述他們特有的功能,並且通過類與類之間的相互協作來完成特定的業務邏輯。這個時候,每個類都需要負責管理與自己有交互的類的引用和依賴,代碼將會變的異常難以維護和極高的高耦合。而IOC的出現正是用來解決這個問題,我們通過IOC將這些依賴對象的創建、協調工作交給spring容器去處理,每個對象值需要關注其自身的業務邏輯關系就可以了。在這樣的角度上來看,獲得依賴的對象的方式,進行了反轉,變成了由spring容器控制對象如何獲取外部資源(包括其他對象和文件資料等)。

總的來說:IOC就是通過在Xml配置文件里依賴注入來解決代碼問題。

IOC的注入類型有幾種?主要可以劃分為三種:構造函數注入、屬性注入和介面注入。Spring支持構造函數注入和屬性注入

面向切面(AOP)


(面向切面編程,AOP其實只是OOP的補充而已,AOP基本上是通過代理機制實現的。)

我們管切入到指定類指定方法的代碼片段稱為切面,而切入到哪些類、哪些方法則叫切入點。有了AOP,我們就可以把幾個類共有的代碼,抽取到一個切片中,等到需要時再切入對象中去,從而改變其原有的行為。

我們都知道 Java 是 OOP-面向對象編程的,它有自己的優勢,也有自己的不足。比如說:在我們開發中,都會有一條業務主線(即客戶的需求)。而我們要做的就是實現這個主線上的需求。我們在實現這些功能的時候,經常要干一些額外的不可避免的事情,比如事務的管理,日誌的記錄等,就很繁雜且代碼量增多,所以 Spring 提供了另一種角度來思考程序結構,也就是把這一些事情剝離出來,然後適時適地的把它們加入到我們的代碼中,比如說 聲明式事務管理的時候,我們在 service 層檢測到save*、update*這些方法要被調用的時候,我們先進行開啟事務什麼的,這就是AOP,面向編程的思想。

AOP的術語:

1、通知(Advice):就是你想要的功能,也就是上面說的 安全,事物,日誌等。你給先定義好把,然後在想用的地方用一下

2、連接點(JoinPoint):這個更好解釋了,就是spring允許你使用通知的地方,那可真就多了,基本每個方法的前,後(兩者都有也行),或拋出異常時都可以是連接點,spring只支持方法連接點.其他如aspectJ還可以讓你在構造器或屬性注入時都行,不過那不是咱關注的,只要記住,和方法有關的前前後後(拋出異常),都是連接點。

3、切入點(Pointcut):上面說的連接點的基礎上,來定義切入點,你的一個類里,有15個方法,那就有幾十個連接點了對把,但是你並不想在所有方法附近都使用通知(使用叫織入,以後再說),你只想讓其中的幾個,在調用這幾個方法之前,之後或者拋出異常時干點什麼,那麼就用切點來定義這幾個方法,讓切點來篩選連接點,選中那幾個你想要的方法。

4、切面(Aspect):切面是通知和切入點的結合。現在發現了吧,沒連接點什麼事情,連接點就是為了讓你好理解切點,搞出來的,明白這個概念就行了。通知說明了干什麼和什麼時候干(什麼時候通過方法名中的before,after,around等就能知道),而切入點說明了在哪干(指定到底是哪個方法),這就是一個完整的切面定義。

5、引入(introction):允許我們向現有的類添加新方法屬性。這不就是把切面(也就是新方法屬性:通知定義的)用到目標類中嗎

6、目標(target):引入中所提到的目標類,也就是要被通知的對象,也就是真正的業務邏輯,他可以在毫不知情的情況下,被咱們織入切面。而自己專注於業務本身的邏輯。

7、代理(proxy):怎麼實現整套aop機制的,都是通過代理,這個一會給細說。

8、織入(weaving):把切面應用到目標對象來創建新的代理對象的過程。有3種方式,spring採用的是運行時,為什麼是運行時,後面解釋。

『肆』 什麼是AOP編程

面向切面編程(也叫面向方面):Aspect
Oriented
Programming(AOP),是目前軟體開發中的一個熱點,也是Spring框架中的一個重要內容。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率。
AOP是OOP的延續,是(Aspect
Oriented
Programming)的縮寫,意思是面向切面(方面)編程。
可以通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一添加功能的一種技術。AOP實際是GoF設計模式的延續,設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。

『伍』 什麼是AOP面向切面編程

aspect
oriented
programming(面向切面編程),可以
通過預編譯方式和運行期動態代理實現在不修改源代碼的情況下給程序動態統一
添加功能的一種技術。

『陸』 什麼是面向切面編程

Aspect Oriented Programming(AOP),面向切面編程,是一個比較熱門的話題。AOP主要實現的目的是針對業務處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲得邏輯過程中各部分之間低耦合性的隔離效果。比如我們最常見的就是日誌記錄了,舉個例子,我們現在提供一個查詢學生信息的服務,但是我們希望記錄有誰進行了這個查詢。如果按照傳統的OOP的實現的話,那我們實現了一個查詢學生信息的服務介面(StudentInfoService)和其實現 類 (StudentInfoServiceImpl.java),同時為了要進行記錄的話,那我們在實現類(StudentInfoServiceImpl.java)中要添加其實現記錄的過程。這樣的話,假如我們要實現的服務有多個呢?那就要在每個實現的類都添加這些記錄過程。這樣做的話就會有點繁瑣,而且每個實現類都與記錄服務日誌的行為緊耦合,違反了面向對象的規則。那麼怎樣才能把記錄服務的行為與業務處理過程中分離出來呢?看起來好像就是查詢學生的服務自己在進行,但卻是背後日誌記錄對這些行為進行記錄,並且查詢學生的服務不知道存在這些記錄過程,這就是我們要討論AOP的目的所在。AOP的編程,好像就是把我們在某個方面的功能提出來與一批對象進行隔離,這樣與一批對象之間降低了耦合性,可以就某個功能進行編程。

『柒』 AOP是什麼意思

AOP為Aspect
Oriented
Programming的縮寫,是面向切面編程,通過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。AOP是OOP的延續,是軟體開發中的一個熱點,也是Spring框架中的一個重要內容,是函數式編程的一種衍生范型。
AOP的出現彌補了OOP的這點不足,AOP
是一個概念,一個規范,本身並沒有設定具體語言的實現,AOP是基於動態代理模式。AOP是方法級別的,要測試的方法不能為static修飾,因為介面中不能存在靜態方法,編譯就會報錯。
AOP可以分離業務代碼和關注點代碼(重復代碼),在執行業務代碼時,動態的注入關注點代碼。切面就是關注點代碼形成的類。Spring
AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理。JDK動態代理通過反射來接收被代理的類,並且要求被代理的類必須實現一個介面。
(7)aop切面編程擴展閱讀
AOP實現的關鍵在於AOP框架自動創建的AOP代理,AOP代理主要分為靜態代理和動態代理,靜態代理的代表為AspectJ。而動態代理則以Spring
AOP為代表,靜態代理是編譯期實現,動態代理是運行期實現,可想而知前者擁有更好的性能。
靜態代理是編譯階段生成AOP代理類,也就是說生成的位元組碼就織入了增強後的AOP對象;動態代理則不會修改位元組碼,而是在內存中臨時生成一個AOP對象,這個AOP對象包含了目標對象的全部方法,並且在特定的切點做了增強處理,並回調原對象的方法。
參考資料來源;搜狗網路--AOP

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:647
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:939
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:634
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:823
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:734
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1069
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:302
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:163
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:855
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:765