电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

詳解spring中aop不生效的幾種解決辦法

瀏覽:5日期:2023-08-31 15:54:31

先看下這個問題的背景:假設有一個spring應用,開發人員希望自定義一個注解@Log,可以加到指定的方法上,實現自動記錄日志(入參、出參、響應耗時這些)

package com.cnblogs.yjmyzz.springbootdemo.aspect; import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface Log { }

然后再寫一個Aspect來解析這個注解,對打了Log注解的方法進行增強處理 

package com.cnblogs.yjmyzz.springbootdemo.aspect; import org.aspectj.lang.JoinPoint;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component; import java.lang.reflect.Method; @Component@Aspectpublic class LogAspect { @Pointcut('execution (* com.cnblogs.yjmyzz.springbootdemo.service..*.*(..))') public void logPointcut() { } @Around('logPointcut()') public void around(JoinPoint point) { String methodName = point.getSignature().getName(); Object[] args = point.getArgs(); Class<?>[] argTypes = new Class[point.getArgs().length]; for (int i = 0; i < args.length; i++) { argTypes[i] = args[i].getClass(); } Method method = null; try { method = point.getTarget().getClass().getMethod(methodName, argTypes); } catch (Exception e) { e.printStackTrace(); } //獲取方法上的注解 Log log = method.getAnnotation(Log.class); if (log != null) { //演示方法執行前,記錄一行日志 System.out.println('before:' + methodName); } try { //執行方法 ((ProceedingJoinPoint) point).proceed(); } catch (Throwable throwable) { throwable.printStackTrace(); } finally { if (log != null) {//演示方法執行后,記錄一行日志System.out.println('after:' + methodName); } } }}

寫一個測試Service類:

package com.cnblogs.yjmyzz.springbootdemo.service; import com.cnblogs.yjmyzz.springbootdemo.aspect.Log;import org.springframework.stereotype.Component; @Componentpublic class HelloService { @Log public void sayHi(String msg) { System.out.println('tsayHi:' + msg); } public void anotherSayHi(String msg) { this.sayHi(msg); } }

最后來跑一把:

package com.cnblogs.yjmyzz.springbootdemo; import com.cnblogs.yjmyzz.springbootdemo.service.HelloService;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.EnableAspectJAutoProxy; /** * @author 菩提樹下的楊過 */@ComponentScan('com.cnblogs.yjmyzz')@Configuration@EnableAspectJAutoProxypublic class SampleApplication { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SampleApplication.class); HelloService helloService = context.getBean(HelloService.class); helloService.sayHi('hi-1'); System.out.println('n'); helloService.anotherSayHi('hi-2'); }}

輸出如下:

詳解spring中aop不生效的幾種解決辦法

顯然HelloService中的anotherSayHi方法,并未被aop增強。 原因其實很簡單,了解AOP原理的同學想必都知道,AOP的實現有二類,如果是基于接口的,會采用動態代理,生成一個代理類,如果是基于類的,會采用CGLib生成子類,然后在子類中擴展父類中的方法。

詳解spring中aop不生效的幾種解決辦法

本文中HelloService并不是一個接口,所以從上圖的斷點中可以看出,當Spring運行時,HelloService被增加為...EnhancerBySpringCGLib...。但是當調用到anotherSayHi時

詳解spring中aop不生效的幾種解決辦法

方法的調用方,其實是原始的HelloSerfvice實例,即:是未經過Spring AOP增強的對象實例。所以解決問題的思路就有了,想辦法用增強后的HelloService實例來調用!

方法一:用Autowired 注入自身的實例

詳解spring中aop不生效的幾種解決辦法

這個方法,第一眼看上去感覺有些怪,自己注入自己,感覺有點象遞歸/死循環的搞法,但確實可以work,Spring在解決循環依賴上有自己的處理方式,避免了死循環。

方法二:從Spring上下文獲取增強后的實例引用

詳解spring中aop不生效的幾種解決辦法

原理與方法一其實類似,不多解釋。

方法三: 利用AopContext

詳解spring中aop不生效的幾種解決辦法

不過這個方法要注意的是,主類入口上,必須加上exporseProxy=true,參考下圖:

詳解spring中aop不生效的幾種解決辦法

最后來驗證下這3種方法是否生效:

詳解spring中aop不生效的幾種解決辦法

從運行結果上看,3種方法都可以解決這個問題?!?/p>

到此這篇關于詳解spring中aop不生效的幾種解決辦法的文章就介紹到這了,更多相關spring中aop不生效內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

作者:菩提樹下的楊過出處:http://yjmyzz.cnblogs.com

標簽: Spring
相關文章:
主站蜘蛛池模板: 超声波清洗机_细胞破碎仪_实验室超声仪器_恒温水浴-广东洁盟深那仪器 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 | 贵州成人高考网_贵州成考网 | 杭州公司变更法人-代理记账收费价格-公司注销代办_杭州福道财务管理咨询有限公司 | 旅游规划_旅游策划_乡村旅游规划_景区规划设计_旅游规划设计公司-北京绿道联合旅游规划设计有限公司 | 北京工业设计公司-产品外观设计-产品设计公司-千策良品工业设计 北京翻译公司-专业合同翻译-医学标书翻译收费标准-慕迪灵 | 英国雷迪地下管线探测仪-雷迪RD8100管线仪-多功能数字听漏仪-北京迪瑞进创科技有限公司 | 皮带输送机-大倾角皮带输送机-皮带输送机厂家-河南坤威机械 | 哔咔漫画网页版在线_下载入口访问指引 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 二手注塑机回收_旧注塑机回收_二手注塑机买卖 - 大鑫二手注塑机 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 老房子翻新装修,旧房墙面翻新,房屋防水补漏,厨房卫生间改造,室内装潢装修公司 - 一修房屋快修官网 | 赛默飞Thermo veritiproPCR仪|ProFlex3 x 32PCR系统|Countess3细胞计数仪|371|3111二氧化碳培养箱|Mirco17R|Mirco21R离心机|仟诺生物 | 手持式线材张力计-套帽式风量罩-深圳市欧亚精密仪器有限公司 | 广州网站建设_小程序开发_番禺网站建设_佛山网站建设_粤联网络 | 煤粉取样器-射油器-便携式等速飞灰取样器-连灵动 | 聚合氯化铝价格_聚合氯化铝厂家_pac絮凝剂-唐达净水官网 | 济南货架定做_仓储货架生产厂_重型货架厂_仓库货架批发_济南启力仓储设备有限公司 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | 热处理炉-退火炉-回火炉设备厂家-丹阳市电炉厂有限公司 | 分子蒸馏设备(短程分子蒸馏装置)_上海达丰仪器| 氧氮氢联合测定仪-联测仪-氧氮氢元素分析仪-江苏品彦光电 | 深圳品牌设计公司-LOGO设计公司-VI设计公司-未壳创意 | 除湿机|工业除湿机|抽湿器|大型地下室车间仓库吊顶防爆除湿机|抽湿烘干房|新风除湿机|调温/降温除湿机|恒温恒湿机|加湿机-杭州川田电器有限公司 | 武汉印刷厂-不干胶标签印刷厂-武汉不干胶印刷-武汉标签印刷厂-武汉标签制作 - 善进特种标签印刷厂 | 广州番禺搬家公司_天河黄埔搬家公司_企业工厂搬迁_日式搬家_广州搬家公司_厚道搬迁搬家公司 | 电动打包机_气动打包机_钢带捆扎机_废纸打包机_手动捆扎机 | 陕西鹏展科技有限公司 | 湖南自考_湖南自学考试| 回转支承-转盘轴承-回转驱动生产厂家-洛阳隆达轴承有限公司 | 石膏基自流平砂浆厂家-高强石膏基保温隔声自流平-轻质抹灰石膏粉砂浆批发-永康市汇利建设有限公司 | 立式壁挂广告机厂家-红外电容触摸一体机价格-华邦瀛 | 聚氨酯保温钢管_聚氨酯直埋保温管道_聚氨酯发泡保温管厂家-沧州万荣防腐保温管道有限公司 | 瑞典Blueair空气净化器租赁服务中心-专注新装修办公室除醛去异味服务! | Akribis直线电机_直线模组_力矩电机_直线电机平台|雅科贝思Akribis-杭州摩森机电科技有限公司 | 卡诺亚轻高定官网_卧室系统_整家定制_定制家居_高端定制_全屋定制加盟_定制家具加盟_定制衣柜加盟 | 我爱古诗词_古诗词名句赏析学习平台 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 粘度计,数显粘度计,指针旋转粘度计 |