一個美女面試官坐到我的對面,發光logo的MacBook也擋不住她那圓潤可愛的臉龐。 程式媛本就稀有,美女面試官更是難尋。具體長什麼樣呢?就像下麵這樣: 這麼溫柔可愛的面試官,應該不會為難我吧。嗯,應該是的,畢竟我這麼帥氣,面試可能就是走個過場。美女面試官是不是單身?畢竟程式員都不善交流,因為我也是 ...
轉自:
http://www.java265.com/JavaFramework/Spring/202206/3612.html
下文筆者將通過示例的方式講述Spring註解(AOP)的簡介說明,如下所示:
package com.java265.aop; public class MathCalculator { public int div(int i, int j){ System.out.println("MathCalculator...div..."); return i / j; } } 切麵類 package com.java265.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.*; import java.util.Arrays; //日誌切麵類 @Aspect public class LogAspects { //收取公共的切入點表達式 1.本類引用:直接寫方法名+()2.其他類引用:全名 @Pointcut("execution(public int com.java265.aop.MathCalculator.div(int, int))") public void pointCut(){} //@Before在目標方法前切入;切入點表達式(指定在哪個方法切入);JointPoint 一定要在參數第一位 @Before("pointCut()") public void logStart(JoinPoint joinPoint){ Object[] args = joinPoint.getArgs(); System.out.println(joinPoint.getSignature().getName() + "運行了...參數列表是:{" + Arrays.asList(args)+ "}"); } @After("pointCut()") public void logEnd(JoinPoint joinPoint){ System.out.println(joinPoint.getSignature().getName() + "結束了..."); } @AfterReturning(value = "pointCut()", returning = "result") public void logReturn(JoinPoint joinPoint, Object result){ System.out.println(joinPoint.getSignature().getName() + "正常返回...運行結果:{" + result + "}"); } //外部類引用切入點表達式 @AfterThrowing(value = "com.java265.aop.LogAspects.pointCut()", throwing = "e") public void logException(JoinPoint joinPoint, Exception e){ System.out.println(joinPoint.getSignature().getName() + "異常...異常信息:{" + e + "}"); } } 配置類: package com.java265.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableAspectJAutoProxy; import com.java265.aop.LogAspects; import com.java265.aop.MathCalculator; /** * AOP:指在程式運行期間動態的將某段代碼切入到指定方法指定位置進行運行的編程方式; * * 1、 導入aop模塊:Spring AOP * 2、 定義一個業務邏輯類(MathCalculator);在業務邏輯運行的時候將日誌進行列印(方法之前,方法運行結束、出現異常等) * 3. 定義一個日誌切麵類(LogAspects):切麵類裡面的方法需要動態感知MathCalculator.div運行到哪裡然後執行 * 通知方法: * 前置通知(@Before):logStart:在目標方法div運行之間運行 * 後置通知(@After):logEnd:在目標方法div運行結束之後運行 * 返回通知(@AfterReturning):logReturn:在目標方法div正常返回之後運行 * 異常通知(@AfterThrowing):logException:在目標方法div出現異常以後運行 * 環繞通知(@Around):動態代理,手動推進目標方法運行(joinPoint.procced()) * 4. 給切麵類的目標方法標註何時運行(通知註解) * 5. 將切麵類和業務邏輯類(目標方法所在類)都加入到IOC容器中 * 6. 必須告訴Spring哪個類是切麵類(給切麵類加一個註解@Aspect) * 7. 給配置類中加@EnableAspectJAutoProxy開啟基於註解的aop模式 */ @EnableAspectJAutoProxy @Configuration public class MainConfigOfAOP { //業務邏輯類加入容器中 @Bean public MathCalculator mathCalculator(){ return new MathCalculator(); } //切麵類加入到容器中 @Bean public LogAspects logAspects(){ return new LogAspects(); } } 測試: @Test public void test01(){ AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(MainConfigOfAOP.class); MathCalculator mathCalcullator = (MathCalculator) ac.getBean("mathCalculator"); mathCalcullator.div(1,1); ac.close(); }
-----運行以上代碼,將輸出以下信息----- div運行了...參數列表是:{[1, 1]} MathCalculator...div... div結束了... div正常返回...運行結果:{1}