成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Spring理論基礎(chǔ)-面向切面編程

voyagelab / 1419人閱讀

摘要:序是的縮寫,中文翻譯是面向切面編程。首先面向切面編程這個(gè)名稱很容易讓人想起面向?qū)ο缶幊虂?lái)。這種動(dòng)態(tài)地將代碼織入到類的指定方法指定位置上的編程思想就是面向切面編程。概念面向切面編程具體的一些概念。

AOPAspect-Oriented Programming的縮寫,中文翻譯是面向切面編程。作為Spring的特征之一,是要好好學(xué)習(xí)的。

首先面向切面編程這個(gè)名稱很容易讓人想起面向?qū)ο缶幊蹋?b>OOP)來(lái)。我們知道面向?qū)ο缶幊淌菑纳贤碌陌严到y(tǒng)拆分成若干個(gè)類,如Web項(xiàng)目中常見(jiàn)的Controller、Service、Dao等分層。但是面向?qū)ο缶幊虒?duì)于從左到右的水平抽象十分無(wú)力,類似于日志、權(quán)限等系統(tǒng)級(jí)功能的代碼會(huì)重復(fù)的出現(xiàn)在任何地方。簡(jiǎn)單的說(shuō),面向切面編程是對(duì)面向?qū)ο缶幊痰囊环N補(bǔ)充,它可以把系統(tǒng)里一些分散的重復(fù)代碼集中在一起,抽象成一個(gè)切面。先來(lái)舉一個(gè)例子:

有一個(gè)內(nèi)部使用的管理系統(tǒng),Controller中的每個(gè)接口在調(diào)用時(shí)都要記錄下當(dāng)前用戶名稱、當(dāng)前時(shí)間等參數(shù)。

很明顯這個(gè)需求的實(shí)現(xiàn)代碼在每個(gè)接口中都是重復(fù)的。即使提取成公共類的公共方法,在每個(gè)接口里也都有一句該公共方法的調(diào)用,導(dǎo)致類之間的耦合。

我們希望把原來(lái)接口中的記錄代碼去除掉,使這些接口只關(guān)注自己的業(yè)務(wù)邏輯。然后使用預(yù)編譯或運(yùn)行期動(dòng)態(tài)代理等方式實(shí)現(xiàn)在不修改接口代碼的情況下,為接口添加記錄功能。這種動(dòng)態(tài)地將代碼織入到類的指定方法、指定位置上的編程思想就是面向切面編程。

概念

面向切面編程具體的一些概念。

《EXPERT ONE ON ONE J2EE DEVELOPMENT WITHOUT EJB》第8章、《Spring實(shí)戰(zhàn)》第4章:

增強(qiáng)(advice,另譯為通知,但《Spring3.x企業(yè)應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)》作者不贊成):在特定連接點(diǎn)執(zhí)行的動(dòng)作。例子中的實(shí)現(xiàn)代碼就是增強(qiáng)。

切點(diǎn)(pointcut):一組連接點(diǎn)的總稱,用于指定某個(gè)增強(qiáng)應(yīng)該在何時(shí)被調(diào)用。例子中的指定哪些接口和指定位置就是切點(diǎn)。

連接點(diǎn)(join point):在應(yīng)用執(zhí)行過(guò)程中能夠插入切面的一個(gè)點(diǎn)。例子中具體的一個(gè)接口和指定位置的結(jié)合就是連接點(diǎn)。

切面(aspect):通知(即增強(qiáng))和切點(diǎn)的結(jié)合。

AOPSpring中主要是通過(guò)動(dòng)態(tài)代理實(shí)現(xiàn)的,具體實(shí)現(xiàn)也分為兩種:JDK動(dòng)態(tài)代理CGLIB動(dòng)態(tài)代理。其中JDK動(dòng)態(tài)代理是基于接口代理,CGLIB動(dòng)態(tài)代理是基于繼承代理。

JDK動(dòng)態(tài)代理

作為Java自帶的一種動(dòng)態(tài)代理技術(shù),JDK動(dòng)態(tài)代理的優(yōu)勢(shì)是使用反射技術(shù)來(lái)生成代理類,在生成效率上比較高。缺點(diǎn)是只能基于接口來(lái)動(dòng)態(tài)代理,如果目標(biāo)類沒(méi)有實(shí)現(xiàn)任何接口是不能使用JDK動(dòng)態(tài)代理的。

來(lái)看一個(gè)用JDK動(dòng)態(tài)代理的例子。

public class DynamicProxy implements InvocationHandler {

    /**
     * 被代理類
     */
    private Object target;

    public DynamicProxy(Object target) {
        this.target = target;
    }

    public static Object bind(Object target) {
        InvocationHandler invocationHandler = new DynamicProxy(target);
        return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), invocationHandler);
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println(method.getName() + " 方法執(zhí)行前");
        //執(zhí)行被代理類方法
        Object ret = method.invoke(target, args);
        System.out.println(method.getName() + " 方法執(zhí)行后");
        return ret;
    }

    public static void main(String[] args) {
        Dao dao = new OrderDao();
        dao.doSomeThing();
        Dao daoProxy = (Dao) DynamicProxy.bind(dao);
        daoProxy.doSomeThing();
    }

}
public class OrderDao implements Dao {

    @Override
    public void doSomeThing() {
        System.out.println("test");
    }

}
public interface Dao {

    void doSomeThing();

}
輸出:
test
doSomeThing 方法執(zhí)行前
test
doSomeThing 方法執(zhí)行后

Process finished with exit code 0
后記

這次只是梳理下概念,把自己理解的AOP概念寫下來(lái)。也參考了很多文章,大體都是一致的細(xì)節(jié)上有些不同,把自己理解的寫出來(lái)給大家看下就知道有沒(méi)有錯(cuò)了。順便整理一下,免得以后別人問(wèn)起自己支支吾吾的不知道從哪說(shuō)起。并沒(méi)有去了解Spring中具體的AOP實(shí)現(xiàn),有興趣的同學(xué)可以自行深入了解下。

我的博客地址

參考資料

什么是面向切面編程AOP?

好書一起讀(115):重學(xué)Spring之面向切面

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/76654.html

相關(guān)文章

  • Spring之旅第七站:面向切面編程(AOP)

    摘要:面向切面的本章主要內(nèi)容面向切面編程的基本原理通過(guò)創(chuàng)建切面使用注解為切面注入依賴。什么是面向切面編程切面能夠幫我們模塊化橫切關(guān)注點(diǎn)。在使用面向切面編程時(shí),我們?nèi)匀辉谝粋€(gè)地方定義通知功能,而無(wú)需修改受影響的類。切面切面是通知和切點(diǎn)的結(jié)合。 面向切面的Spring 本章主要內(nèi)容: 面向切面編程的基本原理 通過(guò)POJO創(chuàng)建切面 使用@Aspect注解 為AspectJ切面注入依賴。 說(shuō)明 ...

    趙連江 評(píng)論0 收藏0
  • SSM

    摘要:核心控制器前端控制器預(yù)處理控制器負(fù)責(zé)接收頁(yè)面請(qǐng)求和返回?cái)?shù)據(jù)給頁(yè)面。使用面向切面編程管理事物日志權(quán)限等。數(shù)據(jù)庫(kù),持久化如何快速學(xué)習(xí)框架的回答知乎其他鏈接 RESTful API 網(wǎng)站即軟件 URI不包含動(dòng)詞 請(qǐng)求方法對(duì)應(yīng) CRUDGET ---SELECT,從服務(wù)器取出資源 POST --- CREATE,在服務(wù)器新建一個(gè)資源 PUT --- UPDATE,在服務(wù)器更新資源(客戶端提供...

    Pandaaa 評(píng)論0 收藏0
  • 慕課網(wǎng)_《Spring入門篇》學(xué)習(xí)總結(jié)

    摘要:入門篇學(xué)習(xí)總結(jié)時(shí)間年月日星期三說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。主要的功能是日志記錄,性能統(tǒng)計(jì),安全控制,事務(wù)處理,異常處理等等。 《Spring入門篇》學(xué)習(xí)總結(jié) 時(shí)間:2017年1月18日星期三說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/zccodere/s...個(gè)人學(xué)習(xí)源碼:https://git...

    Ververica 評(píng)論0 收藏0
  • Spring AOP就是這么簡(jiǎn)單啦

    摘要:是一種特殊的增強(qiáng)切面切面由切點(diǎn)和增強(qiáng)通知組成,它既包括了橫切邏輯的定義也包括了連接點(diǎn)的定義。實(shí)際上,一個(gè)的實(shí)現(xiàn)被拆分到多個(gè)類中在中聲明切面我們知道注解很方便,但是,要想使用注解的方式使用就必須要有源碼因?yàn)槲覀円? 前言 只有光頭才能變強(qiáng) 上一篇已經(jīng)講解了Spring IOC知識(shí)點(diǎn)一網(wǎng)打盡!,這篇主要是講解Spring的AOP模塊~ 之前我已經(jīng)寫過(guò)一篇關(guān)于AOP的文章了,那篇把比較重要的知...

    Jacendfeng 評(píng)論0 收藏0
  • 從源碼入手,一文帶你讀懂Spring AOP面向切面編程

    摘要:,,面向切面編程。,切點(diǎn),切面匹配連接點(diǎn)的點(diǎn),一般與切點(diǎn)表達(dá)式相關(guān),就是切面如何切點(diǎn)。例子中,注解就是切點(diǎn)表達(dá)式,匹配對(duì)應(yīng)的連接點(diǎn),通知,指在切面的某個(gè)特定的連接點(diǎn)上執(zhí)行的動(dòng)作。,織入,將作用在的過(guò)程。因?yàn)樵创a都是英文寫的。 之前《零基礎(chǔ)帶你看Spring源碼——IOC控制反轉(zhuǎn)》詳細(xì)講了Spring容器的初始化和加載的原理,后面《你真的完全了解Java動(dòng)態(tài)代理嗎?看這篇就夠了》介紹了下...

    wawor4827 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

voyagelab

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<