SpringBoot AOP

一帚称、引言

在軟件業(yè)嫩絮,AOP為Aspect Oriented Programming的縮寫,意為:面向切面編程诈乒,通過預(yù)編譯方式和運(yùn)行期動(dòng)態(tài)代理實(shí)現(xiàn)程序功能的統(tǒng)一維護(hù)的一種技術(shù)罩扇。
AOP是OOP的延續(xù),是軟件開發(fā)中的一個(gè)熱點(diǎn)怕磨,也是Spring框架中的一個(gè)重要內(nèi)容喂饥,是函數(shù)式編程的一種衍生范型。
利用AOP可以對(duì)業(yè)務(wù)邏輯的各個(gè)部分進(jìn)行隔離肠鲫,從而使得業(yè)務(wù)邏輯各部分之間的耦合度降低员帮,提高程序的可重用性,同時(shí)提高了開發(fā)的效率导饲。

主要功能

將日志記錄捞高,性能統(tǒng)計(jì)氯材,安全控制,事務(wù)處理棠枉,異常處理等代碼從業(yè)務(wù)邏輯代碼中劃分出來浓体,通過對(duì)這些行為的分離泡挺,我們希望可以將它們獨(dú)立到非指導(dǎo)業(yè)務(wù)邏輯的方法中辈讶,進(jìn)而改變這些行為的時(shí)候不影響業(yè)務(wù)邏輯的代碼。

相關(guān)術(shù)語

目標(biāo)對(duì)象target:要增強(qiáng)的類
連接點(diǎn)(join point):增強(qiáng)類中所有的方法
切入點(diǎn)(pointcut):要具體增強(qiáng)的方法
通知(advice):具體要增強(qiáng)的功能代碼
切面aspect=切入點(diǎn)+通知
織入weaving
代理Proxy

AOP底層實(shí)現(xiàn)

Jdk動(dòng)態(tài)代理:基于接口娄猫,代理對(duì)象與目標(biāo)可理解為兄弟關(guān)系
CGLIB動(dòng)態(tài)代理:目標(biāo)對(duì)象與代理對(duì)象可理解為父子關(guān)系

二贱除、知識(shí)點(diǎn)概要

SpringBoot AOP開發(fā)流程

1、添加 spring-boot-starter-aop媳溺,加入依賴月幌,默認(rèn)就開始了AOP 的支持
2、寫一個(gè) Aspect悬蔽,封裝橫切關(guān)注點(diǎn)(日志扯躺、監(jiān)控等),需要配置通知和切入點(diǎn)
3蝎困、這個(gè)Aspect 需要納入到spring容器管理录语,并且需要加入@Aspect

spring.aop.auto 配置項(xiàng)決定是否啟用AOP,默認(rèn)啟用

默認(rèn)是使用基于JDK的動(dòng)態(tài)代理來實(shí)現(xiàn)AOP
spring.aop.proxy-target-class=false 或者不配置禾乘,表示使用JDK的動(dòng)態(tài)代理
=true 表示使用了 cglib
如果配置了false,而類沒有接口澎埠,則依然使用cglib

三、AOP小Demo實(shí)現(xiàn)

1始藕、目錄結(jié)構(gòu)如下
項(xiàng)目結(jié)構(gòu)
2蒲稳、添加依賴
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
 </dependency>
3、創(chuàng)建UserDao 編寫個(gè)簡(jiǎn)單的測(cè)試方法
/**
 * @author liyao
 * @createTime 2018/8/14
 * @description
 */
@Component
public class UserDao {
    public void add(String username,String password){
        System.out.println("username"+username+",password:"+password);
    }
}
4伍派、編寫切面LogAspect
/**
 * @author liyao
 * @createTime 2018/8/14
 * @description
 */

@Aspect
@Component
public class LogAspect {
    @Before("execution(* com.ly.aop.dao..*.*(..))")
    public void log(){
        System.out.println("method log done");
    }
}
5江耀、測(cè)試結(jié)果
控制臺(tái)打印

四、AOP配置設(shè)置

1诉植、是否啟用動(dòng)態(tài)代理祥国,通過application.properties 配置

通過查看:
AopAutoConfiguration
api

得知配置:

#spring.aop.auto 配置項(xiàng)決定是否啟用AOP,默認(rèn)啟用
spring.aop.auto = true
#默認(rèn)是使用基于JDK的動(dòng)態(tài)代理來實(shí)現(xiàn)AOP
#spring.aop.proxy-target-class=false 或者不配置倍踪,表示使用JDK的動(dòng)態(tài)代理
#=true 表示使用了 cglib
#如果配置了false,而類沒有接口系宫,則依然使用cglib
spring.aop.proxy-target-class = true
(1) Cglib 動(dòng)態(tài)代理配置
spring.aop.auto = true
#如果配置了false,而類沒有接口,則依然使用cglib
spring.aop.proxy-target-class = true

結(jié)果如圖:


cglib動(dòng)態(tài)代理
(2) JDK動(dòng)態(tài)代理配置

spring.aop.auto = false 則不會(huì)啟用
如下圖

未啟用

默認(rèn)是使用基于JDK的動(dòng)態(tài)代理來實(shí)現(xiàn)AOP建车,如果配置了false,而類沒有接口扩借,則依然使用cglib,因?yàn)閖dk 動(dòng)態(tài)代理是基于接口實(shí)現(xiàn)的缤至。

spring.aop.auto = true
#如果配置了false,而類沒有接口潮罪,則依然使用cglib
spring.aop.proxy-target-class = false

結(jié)果如下圖:
仍然是 cglib 動(dòng)態(tài)代理方式

如何處理康谆?
這里添加一個(gè)接口即可:

public interface IUserDao {
    public void add(String username,String password);
}
@Component
public class UserDao implements IUserDao {
        public void add(String username,String password){
            System.out.println("username:"+username+",password:"+password);
        }
}

結(jié)果如圖:
jdk動(dòng)態(tài)代理

2、獲取操作對(duì)象信息的一些api

/**
 * @author liyao
 * @createTime 2018/8/14
 * @description
 */

@Aspect
@Component
public class LogAspect {
    @Before("execution(* com.ly.aop.dao..*.*(..))")
    public void log(){
        System.out.println("before method log done");
        //System.out.println("before method log done" + AopContext.currentProxy().getClass());
    }
   /**
     * 獲取通知的信息
     * @param point
     */
    @After("execution(* com.ly.aop.dao..*.*(..))")
    public void logAfter(JoinPoint point){
        System.out.println("after method log done");
        System.out.println(
                 " 操作的對(duì)象:"+point.getTarget().getClass()+"args"
                + " 方法參數(shù):"+Arrays.asList(point.getArgs())
                + " 方法名:"+point.getSignature().getName());
    }
}

結(jié)果如圖:
aop

3嫉到、注解配置

@EnableAspectJAutoProxy 注解有兩個(gè)屬性
屬性

exproxy true ---> 可以 AopContext.currentProxy().getClass()獲取代理對(duì)象
exproxy false ---> 不可以獲取代理對(duì)象

@EnableAspectJAutoProxy(exposeProxy = true)
@SpringBootApplication
public class AopApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(AopApplication.class, args);
        System.out.println(context.getBean(IUserDao.class).getClass());
        context.getBean(IUserDao.class).add("admin","123");
        context.close();

    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末沃暗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子何恶,更是在濱河造成了極大的恐慌孽锥,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件细层,死亡現(xiàn)場(chǎng)離奇詭異惜辑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)疫赎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門盛撑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捧搞,你說我怎么就攤上這事抵卫。” “怎么了胎撇?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵介粘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我创坞,道長(zhǎng)碗短,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任题涨,我火速辦了婚禮偎谁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纲堵。我一直安慰自己巡雨,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布席函。 她就那樣靜靜地躺著铐望,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茂附。 梳的紋絲不亂的頭發(fā)上正蛙,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音营曼,去河邊找鬼乒验。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蒂阱,可吹牛的內(nèi)容都是我干的锻全。 我是一名探鬼主播狂塘,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼鳄厌!你這毒婦竟也來了荞胡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤了嚎,失蹤者是張志新(化名)和其女友劉穎泪漂,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體新思,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡窖梁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年赘风,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夹囚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡邀窃,死狀恐怖荸哟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瞬捕,我是刑警寧澤鞍历,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站肪虎,受9級(jí)特大地震影響劣砍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扇救,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一刑枝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧迅腔,春花似錦装畅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至锌雀,卻和暖如春蚂夕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腋逆。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工婿牍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闲礼。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓牍汹,卻偏偏與公主長(zhǎng)得像铐维,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慎菲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容