最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用AOP,內(nèi)部方法失效的解決方案

 更新時間:2021年08月28日 14:46:27   作者:Lpepsi  
這篇文章主要介紹了SpringBoot使用AOP,內(nèi)部方法失效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

SpringBoot使用AOP,內(nèi)部方法失效

最近在使用AOP的時候,發(fā)現(xiàn)一個問題,普通的方法AOP就能夠有用,而內(nèi)部調(diào)用的方法AOP就會失效,下面重現(xiàn)下問題

AOP切面

@Aspect
@Component
public class AuthorityAspect {
    @Pointcut("execution(* authority.service.AuthorityService.getExecutableSql(..))")
    private void pointCut() {}
    @Around(value = "pointCut()")
    public Object handle(ProceedingJoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        String sql = (String) args[1];
        args[1] = sql + " AOP ";
        return joinPoint.proceed(args);
    }

該切面的作用就是,當執(zhí)行g(shù)etExecutableSql()方法,織入切面,獲取到該方法的參數(shù),修改參數(shù)然后再執(zhí)行該方法

現(xiàn)在有兩個方法

@Service
public class AuthorityService {
    public String getExecutableSql(String dataSourceId, String sql, Object page){
        return sql;
    }
    public String getInner(String dataSourceId, String sql, Object page){
        String str = this.getExecutableSql(dataSourceId, sql, page);
        return str;
    }
}
  • 一個是普通方法getExecutableSql(),
  • 一個是在內(nèi)部調(diào)用了getExecutableSql()的getInner()方法

同時運行這兩個方法

在這里插入圖片描述

可以發(fā)現(xiàn)內(nèi)部調(diào)用了getExecutableSql()的方法,AOP對它并沒有生效,直接調(diào)用的就生效了。在說原因前,我們先說說動態(tài)代理 因為AOP的原理就是動態(tài)代理

動態(tài)代理簡單來說就是在程序運行的過程中,自動生成一個指定的代理類,然后執(zhí)行程序,這個代理類可以在破壞原來被代理對象的情況下做一下額外的工作。

寫一個簡單的動態(tài)代理的例子

//接口
public interface ProxyService {
    void save();
    void email();
    void register();
}
//實現(xiàn)類
@Service
public class ProxyServiceImpl implements ProxyService{
    @Override
    public void save() {
    }
    @Override
    public void email() {
    }
    @Override
    public void register() {
        this.save();
        this.email();
    }
}
//獲得代理
public class ServiceProxy {
    public static Object getProxy(Class<?> clazz,Object target){
        return Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[]{clazz}, new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                Object invoke = method.invoke(target, args);
                System.out.println("after method: "+method.getName());
                return invoke;
            }
        });
    }
}
//測試類
public class ProxyTest {
    public static void main(String[] args) {
        ProxyService proxyService = (ProxyService) ServiceProxy.getProxy(ProxyService.class, new ProxyServiceImpl());
        proxyService.register();
    }
}

結(jié)果:

在這里插入圖片描述

可以看到動態(tài)代理中,內(nèi)部方法調(diào)用也是沒有生效,通過對代理類的Class文件分析,我們可以知道只有通過代理類的實例執(zhí)行的方法才會進入到攔截處理中

在這里插入圖片描述

而動態(tài)代理的方法真實調(diào)用,會使用真實被代理對象實例進行方法調(diào)用,故在實例方法中通過this獲取的都是被代理的真實對象的實例,而不是代理對象自身。通過Debug可以看到

在這里插入圖片描述

this獲取的不是代理對象,因此無法進入攔截處理,所以代理增強的方法沒有執(zhí)行。原因知道了,那就解決辦法就是讓代理對象去調(diào)用這些方法,就能夠進入攔截處理了,修改下代碼

@Service
public class ProxyServiceImpl implements ProxyService{
    
    @Override
    public void save() {
    }
    @Override
    public void email() {
    }
    @Override
    public void register() {
        //獲取代理對象
        ProxyService proxyService = (ProxyService) ServiceProxy.getProxy(ProxyService.class, new ProxyServiceImpl());
        proxyService.save();
        proxyService.email();
    }
}

執(zhí)行一下

在這里插入圖片描述

在SpringBoot中可以用下面的方法,來使內(nèi)部調(diào)用的方法AOP也能對其生效

@Service
public class AuthorityService {
	//獲取代理對象
    @Autowired
    private AuthorityService authorityService;
    public String getExecutableSql(String dataSourceId, String sql, Object page){
        return sql;
    }
    public String getInner(String dataSourceId, String sql, Object page){
        String str = authorityService.getExecutableSql(dataSourceId, sql, page);
        return str;
    }
}

在這里插入圖片描述

可以看到內(nèi)部調(diào)用的方法也生效了

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java獲得指定區(qū)間數(shù)的方法

    Java獲得指定區(qū)間數(shù)的方法

    這篇文章主要介紹了Java獲得指定區(qū)間數(shù)的方法,涉及java數(shù)值運算的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • 簡單的理解java集合中的HashSet和HashTree幾個重寫方法

    簡單的理解java集合中的HashSet和HashTree幾個重寫方法

    這篇文章主要介紹了簡單的理解java集合中的HashSet和HashTree幾個重寫方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Java中的CompletableFuture原理與用法

    Java中的CompletableFuture原理與用法

    CompletableFuture 是由Java8引入的,這讓我們編寫清晰可讀的異步代碼變得更加容易,該類功能比Future 更加強大,在Java中CompletableFuture用于異步編程,異步通常意味著非阻塞,運行任務單獨的線程,與主線程隔離,這篇文章介紹CompletableFuture原理與用法,一起看看吧
    2024-01-01
  • Java TCP編程之Scoket

    Java TCP編程之Scoket

    TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission Control Protocol,它是位于網(wǎng)絡OSI模型中的第四層
    2022-11-11
  • Java多線程中Lock的使用小結(jié)

    Java多線程中Lock的使用小結(jié)

    jdk1.5 以后,提供了各種鎖,本文主要介紹了Java多線程中Lock的使用小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • Java 線程的生命周期詳細介紹及實例代碼

    Java 線程的生命周期詳細介紹及實例代碼

    這篇文章主要介紹了Java 線程的生命周期的相關(guān)資料,并附簡單實例代碼,幫助大家理解,需要的朋友可以參考下
    2016-10-10
  • Java日常練習題,每天進步一點點(52)

    Java日常練習題,每天進步一點點(52)

    下面小編就為大家?guī)硪黄狫ava基礎的幾道練習題(分享)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-08-08
  • IDEA 2020.1 搜索不到Chinese ​(Simplified)​ Language Pack EAP,無法安裝的問題

    IDEA 2020.1 搜索不到Chinese ​(Simplified)​ Language

    小編在安裝中文插件時遇到IDEA 2020.1 搜索不到Chinese &#8203;(Simplified)&#8203; Language Pack EAP,無法安裝的問題,本文給大家分享我的解決方法,感興趣的朋友一起看看吧
    2020-04-04
  • SpringBoot使用knife4j進行在線接口調(diào)試

    SpringBoot使用knife4j進行在線接口調(diào)試

    這篇文章主要介紹了SpringBoot使用knife4j進行在線接口調(diào)試,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • commons fileupload實現(xiàn)文件上傳的實例代碼

    commons fileupload實現(xiàn)文件上傳的實例代碼

    這篇文章主要介紹了commons fileupload實現(xiàn)文件上傳的實例代碼,包括文件上傳的原理分析等相關(guān)知識點,本文給大家介紹的非常詳細,具有參考借鑒價值,感興趣的朋友一起看看吧
    2016-10-10

最新評論

渝中区| 汕头市| 长岭县| 绵阳市| 康平县| 盘锦市| 卓资县| 开原市| 宿州市| 五华县| 遵化市| 哈尔滨市| 宜城市| 囊谦县| 东方市| 舞阳县| 桑日县| 丰顺县| 浙江省| 邯郸县| 涿鹿县| 天津市| 繁峙县| 芜湖市| 佛冈县| 松滋市| 沂南县| 方城县| 永昌县| 嘉峪关市| 井研县| 德昌县| 河源市| 紫金县| 铜陵市| 青州市| 东山县| 黑龙江省| 宁国市| 武汉市| 柳河县|