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

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

Spring aop失效的幾種解決方案

瀏覽:121日期:2023-09-06 13:16:42

先看下這個問題的背景:假設有一個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種方法都可以解決這個問題。 

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 编织人生 - 权威手工编织网站,编织爱好者学习毛衣编织的门户网站,织毛衣就上编织人生网-编织人生 | 刹车盘机床-刹车盘生产线-龙口亨嘉智能装备| 全自动贴标机-套标机-工业热风机-不干胶贴标机-上海厚冉机械 | 硅胶布|电磁炉垫片|特氟龙胶带-江苏浩天复合材料有限公司 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 温湿度记录纸_圆盘_横河记录纸|霍尼韦尔记录仪-广州汤米斯机电设备有限公司 | 健身器材-健身器材厂家专卖-上海七诚健身器材有限公司 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 上海logo设计| 不锈钢丸厂家,铝丸,铸钢丸-淄博智源铸造材料有限公司 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 无菌水质袋-NASCO食品无菌袋-Whirl-Pak无菌采样袋-深圳市慧普德贸易有限公司 | 品牌广告服务平台,好排名,好流量,好生意。 | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 铝扣板-铝方通-铝格栅-铝条扣板-铝单板幕墙-佳得利吊顶天花厂家 elisa试剂盒价格-酶联免疫试剂盒-猪elisa试剂盒-上海恒远生物科技有限公司 | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 | 阿米巴企业经营-阿米巴咨询管理-阿米巴企业培训-广东键锋企业管理咨询有限公司 | 冷藏车厂家|冷藏车价格|小型冷藏车|散装饲料车厂家|程力专用汽车股份有限公司销售十二分公司 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 无锡网站建设-做网站-建网站-网页设计制作-阿凡达建站公司 | 共享雨伞_共享童车_共享轮椅_共享陪护床-共享产品的领先者_有伞科技 | 安平县鑫川金属丝网制品有限公司,声屏障,高速声屏障,百叶孔声屏障,大弧形声屏障,凹凸穿孔声屏障,铁路声屏障,顶部弧形声屏障,玻璃钢吸音板 | 「钾冰晶石」氟铝酸钾_冰晶石_氟铝酸钠「价格用途」-亚铝氟化物厂家 | 河南mpp电力管_mpp电力管生产厂家_mpp电力电缆保护管价格 - 河南晨翀实业 | 浇注料-高铝砖耐火砖-郑州凯瑞得窑炉耐火材料有限公司 | 集菌仪_智能集菌仪_全封闭集菌仪_无菌检查集菌仪厂家-那艾 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 超声骨密度仪-动脉硬化检测仪器-人体成分分析仪厂家/品牌/价格_南京科力悦 | 阜阳在线-阜阳综合门户 | 反渗透阻垢剂-缓蚀阻垢剂厂家-循环水处理药剂-山东鲁东环保科技有限公司 | 压片机_高速_单冲_双层_花篮式_多功能旋转压片机-上海天九压片机厂家 | 防渗膜厂家|养殖防渗膜|水产养殖防渗膜-泰安佳路通工程材料有限公司 | 工控机-工业平板电脑-研华工控机-研越无风扇嵌入式box工控机 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 南京兰江泵业有限公司-水解酸化池潜水搅拌机-絮凝反应池搅拌机-好氧区潜水推进器 | 电子万能试验机_液压拉力试验机_冲击疲劳试验机_材料试验机厂家-济南众标仪器设备有限公司 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 东莞市踏板石餐饮管理有限公司_正宗桂林米粉_正宗桂林米粉加盟_桂林米粉加盟费-东莞市棒子桂林米粉 |