spring-aop

aop的目標(biāo):

  1. 方法增強(qiáng),構(gòu)造器增強(qiáng)吭狡,屬性增強(qiáng)
  2. 動(dòng)態(tài)的向”對(duì)象“添加方法(Introduction)

核心概念:

  1. 技術(shù)本質(zhì):運(yùn)行時(shí)的"動(dòng)態(tài)字節(jié)碼生成"丙号,使用JDK的Proxy和CGLIB技術(shù)
  2. 目前可以完成兩大功能:方法調(diào)用代理和方法引入侨核。
  3. 基本名詞:Aspect,Advice,JoinPoint,Pointcut,Introduction,Weaving
  4. weaving的基本方式 :編譯期(AspectJ),類加載期(AspectJ5)贷帮,運(yùn)行期(Spring)

Spring對(duì)AOP的支持:

  1. 經(jīng)典方式(不推薦):
    基于org.aopalliance.aop.Advice 及ProxyFactoryBean,需要大量的配置及非pojo類的侵入式設(shè)計(jì)
  2. pojo 切面
    基于<aop: >方式柒瓣,不需要引入接口儒搭,但只能基于xml方式
  3. 使用AspectJ的注解(需要引入AspectJweaver包)
    該方法只是使用了AspectJ的注解,來(lái)完成pojo切面的注解方式
  4. 使用AspectJ的切面
    利用強(qiáng)大的AspectJ框架的切面芙贫,完成構(gòu)造器及屬性攔截搂鲫。

Aspect、Advice屹培、Pointcut的定義默穴,設(shè)定Joinpoint及Weaving

  1. 類級(jí)別上@Aspect
  2. 方法級(jí)別定義Joinpoint @Bfore,@After,@AfterThrowing,@AfterReturning,@Around
  3. 在joinpoint中怔檩,定義pointcut: @Before("execution(* package.ClassName.method(args))")
  4. (選項(xiàng):pointcut的復(fù)用):
    @Pointcut("execution(* ...)") method(){};
    此時(shí),@Before("method()")
  5. 注入容器:@Component或<bean class="..">
  6. 啟動(dòng)自動(dòng)代理:@EnableAspectJAutoProxy或<aop:asepect-autoproxy>

處理目標(biāo)中的參數(shù)

  1. 使用環(huán)繞通知中的參數(shù)獲取 ProceedingJoinPoint
  2. 利用AspectJ指示器:args()及this()
  3. 使用:
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LogAspect {
    //單獨(dú)定義pointcut的兩種方式
    @Pointcut(value = "execution(* cn.johnyu.service.WorkService.work(int))&&args(arg)&&this(target)")
    public void pointcut1(int arg,Object target){};
    public final String pointcut2="execution(* cn.johnyu.service.WorkService.work(int))&&args(arg)&&this(target)";

    //定義Joinpoint及使用pointcut
    @Before("pointcut1(arg,target)")
    //@Before(pointcut2)
   // @Before(value = "execution(* cn.johnyu.service.WorkService.work(int))&&args(arg)&&this(target)")
    public void logBefore(int arg,Object target){
        //arg是target方法中的參數(shù)蓄诽,target是當(dāng)前被代理對(duì)象
    }
}

為“對(duì)象”加入新方法

  1. Java為靜態(tài)語(yǔ)言薛训,此項(xiàng)工作并不提供原生的支持

  2. 只能通過(guò)操作字節(jié)碼的方案完成此項(xiàng)工作

  3. Spring利用AspectJ的注解,在運(yùn)行期完成了此項(xiàng)工作仑氛。

  4. 新增加的接口及功能實(shí)現(xiàn):

@Component
public class AttachFunctionImpl implements AttachFunction{
    @Override
    public void attach() {
        System.out.println("attach....");
    }
}
  1. 使用“Introductor”類
@Aspect
@Component
public class AttachIntroducer {
    // "+"表明乙埃,代理的目標(biāo)為接口所有的實(shí)現(xiàn)類
    @DeclareParents(value = "cn.johnyu.service.WorkService+",defaultImpl = AttachFunctionImpl.class)
    public static AttachFunction attachFunction;
}
  1. 測(cè)試使用:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = AppConfig.class)
public class AppTest {
    @Autowired private WorkService workService;
    @Test
    public void test1(){
        workService.work(2);
        AttachFunction a=(AttachFunction)workService;
        a.attach();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锯岖,隨后出現(xiàn)的幾起案子介袜,更是在濱河造成了極大的恐慌,老刑警劉巖出吹,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件遇伞,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡捶牢,警方通過(guò)查閱死者的電腦和手機(jī)鸠珠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秋麸,“玉大人渐排,你說(shuō)我怎么就攤上這事【捏。” “怎么了驯耻?”我有些...
    開(kāi)封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)炒考。 經(jīng)常有香客問(wèn)我可缚,道長(zhǎng),這世上最難降的妖魔是什么斋枢? 我笑而不...
    開(kāi)封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任城看,我火速辦了婚禮,結(jié)果婚禮上杏慰,老公的妹妹穿的比我還像新娘。我一直安慰自己炼鞠,他們只是感情好缘滥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谒主,像睡著了一般朝扼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上霎肯,一...
    開(kāi)封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天擎颖,我揣著相機(jī)與錄音榛斯,去河邊找鬼。 笑死搂捧,一個(gè)胖子當(dāng)著我的面吹牛驮俗,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播允跑,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼王凑,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了聋丝?” 一聲冷哼從身側(cè)響起索烹,我...
    開(kāi)封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎弱睦,沒(méi)想到半個(gè)月后百姓,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡况木,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年垒拢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片焦读。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡子库,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矗晃,到底是詐尸還是另有隱情仑嗅,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布张症,位于F島的核電站仓技,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏俗他。R本人自食惡果不足惜脖捻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望兆衅。 院中可真熱鬧地沮,春花似錦、人聲如沸羡亩。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)畏铆。三九已至雷袋,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間辞居,已是汗流浹背楷怒。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工蛋勺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鸠删。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓抱完,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冶共。 傳聞我的和親對(duì)象是個(gè)殘疾皇子乾蛤,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

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

  • 前言 只有光頭才能變強(qiáng) 上一篇已經(jīng)講解了Spring IOC知識(shí)點(diǎn)一網(wǎng)打盡!捅僵,這篇主要是講解Spring的AOP模...
    Java3y閱讀 6,884評(píng)論 8 181
  • 基本知識(shí) 其實(shí), 接觸了這么久的 AOP, 我感覺(jué), AOP 給人難以理解的一個(gè)關(guān)鍵點(diǎn)是它的概念比較多, 而且坑爹...
    永順閱讀 8,211評(píng)論 5 114
  • [TOC] 概述 在軟件開(kāi)發(fā)中家卖,散布于應(yīng)用中多處的功能被稱為橫切關(guān)注點(diǎn)(cross-cutting concern...
    0x70e8閱讀 611評(píng)論 0 0
  • 轉(zhuǎn)自:https://javadoop.com/post/spring-aop-intro Spring AOP ...
    劍書藏于西閱讀 1,308評(píng)論 0 8
  • 我們的程序從編寫到執(zhí)行上荡,單個(gè)模塊一般都是從上到下、垂直馒闷、連續(xù)的酪捡。AOP是一種“橫切”技術(shù),能夠在合適的地方“攔腰截...
    消失er閱讀 1,988評(píng)論 0 5