week 7 spring AOP
AOP是Spring框架面向切面的編程思想,AOP采用一種稱為“橫切”的技術(shù),將涉及多業(yè)務(wù)流程的通用功能抽取并單獨(dú)封裝,形成獨(dú)立的切面,在合適的時(shí)機(jī)將這些切面橫向切入到業(yè)務(wù)流程指定的位置中。本篇結(jié)合實(shí)際案例詳細(xì)講述AOP的原理及實(shí)現(xiàn)過(guò)程。通過(guò)本篇的學(xué)習(xí),可以達(dá)成如下目標(biāo)。
● 理解AOP的編程思想及原理
● 掌握AOP的實(shí)現(xiàn)技術(shù)
Spring框架的AOP機(jī)制可以讓開發(fā)者把業(yè)務(wù)流程中的通用功能抽取出來(lái),單獨(dú)編寫功能代碼。在業(yè)務(wù)流程執(zhí)行過(guò)程中,Spring框架會(huì)根據(jù)業(yè)務(wù)流程要求,自動(dòng)把獨(dú)立編寫的功能代碼切入到流程的合適位置。
例如,在一個(gè)業(yè)務(wù)系統(tǒng)中,用戶登錄是基礎(chǔ)功能,凡是涉及到用戶的業(yè)務(wù)流程都要求用戶進(jìn)行系統(tǒng)登錄。如果把用戶登錄功能代碼寫入到每個(gè)業(yè)務(wù)流程中,會(huì)造成代碼冗余,維護(hù)也非常麻煩,當(dāng)需要修改用戶登錄功能時(shí),就需要修改每個(gè)業(yè)務(wù)流程的用戶登錄代碼,這種處理方式顯然是不可取的。比較好的做法是把用戶登錄功能抽取出來(lái),形成獨(dú)立的模塊,當(dāng)業(yè)務(wù)流程需要用戶登錄時(shí),系統(tǒng)自動(dòng)把登錄功能切入到業(yè)務(wù)流程中。下圖是用戶登錄功能切入到業(yè)務(wù)流程示意圖。
案例分析:參考:https://baijiahao.baidu.com/s?id=1613310315603029991&wfr=spider&for=pc
一.前言
? ? 在以前的項(xiàng)目中,很少去關(guān)注spring aop的具體實(shí)現(xiàn)與理論,只是簡(jiǎn)單了解了一下什么是aop具體怎么用,看到了一篇博文寫得還不錯(cuò),就轉(zhuǎn)載來(lái)學(xué)習(xí)一下,博文地址:http://www.cnblogs.com/xrq730/p/4919025.html
AOP
AOP(Aspect Oriented Programming),即面向切面編程,可以說(shuō)是OOP(Object Oriented Programming,面向?qū)ο缶幊?#xff09;的補(bǔ)充和完善。OOP引入封裝、繼承、多態(tài)等概念來(lái)建立一種對(duì)象層次結(jié)構(gòu),用于模擬公共行為的一個(gè)集合。不過(guò)OOP允許開發(fā)者定義縱向的關(guān)系,但并不適合定義橫向的關(guān)系,例如日志功能。日志代碼往往橫向地散布在所有對(duì)象層次中,而與它對(duì)應(yīng)的對(duì)象的核心功能毫無(wú)關(guān)系對(duì)于其他類型的代碼,如安全性、異常處理和透明的持續(xù)性也都是如此,這種散布在各處的無(wú)關(guān)的代碼被稱為橫切(cross cutting),在OOP設(shè)計(jì)中,它導(dǎo)致了大量代碼的重復(fù),而不利于各個(gè)模塊的重用。
AOP技術(shù)恰恰相反,它利用一種稱為"橫切"的技術(shù),剖解開封裝的對(duì)象內(nèi)部,并將那些影響了多個(gè)類的公共行為封裝到一個(gè)可重用模塊,并將其命名為"Aspect",即切面。所謂"切面",簡(jiǎn)單說(shuō)就是那些與業(yè)務(wù)無(wú)關(guān),卻為業(yè)務(wù)模塊所共同調(diào)用的邏輯或責(zé)任封裝起來(lái),便于減少系統(tǒng)的重復(fù)代碼,降低模塊之間的耦合度,并有利于未來(lái)的可操作性和可維護(hù)性。
使用"橫切"技術(shù),AOP把軟件系統(tǒng)分為兩個(gè)部分:核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)。業(yè)務(wù)處理的主要流程是核心關(guān)注點(diǎn),與之關(guān)系不大的部分是橫切關(guān)注點(diǎn)。橫切關(guān)注點(diǎn)的一個(gè)特點(diǎn)是,他們經(jīng)常發(fā)生在核心關(guān)注點(diǎn)的多處,而各處基本相似,比如權(quán)限認(rèn)證、日志、事物。AOP的作用在于分離系統(tǒng)中的各種關(guān)注點(diǎn),將核心關(guān)注點(diǎn)和橫切關(guān)注點(diǎn)分離開來(lái)。
?
AOP核心概念
1、橫切關(guān)注點(diǎn)
對(duì)哪些方法進(jìn)行攔截,攔截后怎么處理,這些關(guān)注點(diǎn)稱之為橫切關(guān)注點(diǎn)
2、切面(aspect)
類是對(duì)物體特征的抽象,切面就是對(duì)橫切關(guān)注點(diǎn)的抽象
3、連接點(diǎn)(joinpoint)
被攔截到的點(diǎn),因?yàn)镾pring只支持方法類型的連接點(diǎn),所以在Spring中連接點(diǎn)指的就是被攔截到的方法,實(shí)際上連接點(diǎn)還可以是字段或者構(gòu)造器
4、切入點(diǎn)(pointcut)
對(duì)連接點(diǎn)進(jìn)行攔截的定義
5、通知(advice)
所謂通知指的就是指攔截到連接點(diǎn)之后要執(zhí)行的代碼,通知分為前置、后置、異常、最終、環(huán)繞通知五類
6、目標(biāo)對(duì)象
代理的目標(biāo)對(duì)象
7、織入(weave)
將切面應(yīng)用到目標(biāo)對(duì)象并導(dǎo)致代理對(duì)象創(chuàng)建的過(guò)程
8、引入(introduction)
在不修改代碼的前提下,引入可以在運(yùn)行期為類動(dòng)態(tài)地添加一些方法或字段
?
Spring對(duì)AOP的支持
Spring中AOP代理由Spring的IOC容器負(fù)責(zé)生成、管理,其依賴關(guān)系也由IOC容器負(fù)責(zé)管理。因此,AOP代理可以直接使用容器中的其它bean實(shí)例作為目標(biāo),這種關(guān)系可由IOC容器的依賴注入提供。Spring創(chuàng)建代理的規(guī)則為:
1、默認(rèn)使用Java動(dòng)態(tài)代理來(lái)創(chuàng)建AOP代理,這樣就可以為任何接口實(shí)例創(chuàng)建代理了
2、當(dāng)需要代理的類不是代理接口的時(shí)候,Spring會(huì)切換為使用CGLIB代理,也可強(qiáng)制使用CGLIB
AOP編程其實(shí)是很簡(jiǎn)單的事情,縱觀AOP編程,程序員只需要參與三個(gè)部分:
1、定義普通業(yè)務(wù)組件
2、定義切入點(diǎn),一個(gè)切入點(diǎn)可能橫切多個(gè)業(yè)務(wù)組件
3、定義增強(qiáng)處理,增強(qiáng)處理就是在AOP框架為普通業(yè)務(wù)組件織入的處理動(dòng)作
所以進(jìn)行AOP編程的關(guān)鍵就是定義切入點(diǎn)和定義增強(qiáng)處理,一旦定義了合適的切入點(diǎn)和增強(qiáng)處理,AOP框架將自動(dòng)生成AOP代理,即:代理對(duì)象的方法=增強(qiáng)處理+被代理對(duì)象的方法。
下面給出一個(gè)Spring AOP的.xml文件模板,名字叫做aop.xml,之后的內(nèi)容都在aop.xml上進(jìn)行擴(kuò)展:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.2.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.2.xsd"></beans>
?
基于Spring的AOP簡(jiǎn)單實(shí)現(xiàn)
注意一下,在講解之前,說(shuō)明一點(diǎn):使用Spring AOP,要成功運(yùn)行起代碼,只用Spring提供給開發(fā)者的jar包是不夠的,請(qǐng)額外上網(wǎng)下載兩個(gè)jar包:
1、aopalliance.jar
2、aspectjweaver.jar
開始講解用Spring AOP的XML實(shí)現(xiàn)方式,先定義一個(gè)接口:
public interface HelloWorld {void printHelloWorld();void doPrint(); }public class HelloWorldImpl1 implements HelloWorld
{
??? public void printHelloWorld()
??? {
??????? System.out.println("Enter HelloWorldImpl1.printHelloWorld()");
??? }
???
??? public void doPrint()
??? {
??????? System.out.println("Enter HelloWorldImpl1.doPrint()");
??????? return ;
}
?
?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/EST-woah/p/10690033.html
總結(jié)
以上是生活随笔為你收集整理的week 7 spring AOP的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: unittest中的测试固件
- 下一篇: 时态同步