XML配置AOP
阿新 • • 發佈:2021-10-29
需結合上篇的AOP五種通知方式
LogAspectXml.java
package org.javaboy.aop; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; public class LogAspectXml { public void before(JoinPoint joinPoint){ String name = joinPoint.getSignature().getName(); System.out.println(name+"方法開始執行了~"); } /** * 後置通知,在目標方法執行之後執行 * @param joinPoint */ public void after(JoinPoint joinPoint){ String name = joinPoint.getSignature().getName(); System.out.println(name+"方法執行結束了...a"); } /** * 返回通知,可以在該方法中獲取目標方法的返回值,如果目標方法的返回值為void,則收到null * @param joinPoint * @param r 返回的引數名稱 和這裡方法的引數名一一對應 */ public void returning(JoinPoint joinPoint,Integer r){ String name = joinPoint.getSignature().getName(); System.out.println(name+"方法返回通知:"+r); } /** * 異常通知,當目標方法丟擲異常時,該方法會觸發 * @param joinPoint * @param e 異常引數,和方法的引數名一一對應,注意異常的型別 */ public void afterThrowing(JoinPoint joinPoint,Exception e){ String name = joinPoint.getSignature().getName(); System.out.println(name+"方法異常通知:"+e.getMessage()); } /** * 環繞通知,環繞通知是上面四種方法的集大成者,環繞通知的核心類似於在反射中執行方法 * @param pjp * @return */ public Object around(ProceedingJoinPoint pjp) throws Throwable { //這個方法有點類似於method.invoke 方法,我們可以在這個方法的前後分別新增日誌,相當於前置/後置通知 Object proceed = pjp.proceed(new Object[]{5,5}); return proceed; } }
resources下的applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd"> <bean class="org.javaboy.aop.LogAspectXml" name="logAspect"/> <bean class="org.javaboy.aop.service.MyCalculatorImpl" id="myCalculator"/> <aop:config> <aop:pointcut id="pointcut" expression="execution(* org.javaboy.aop.service.*.*(..))"/> <aop:aspect ref="logAspect"> <aop:before method="before" pointcut-ref="pointcut"/> <aop:after method="after" pointcut-ref="pointcut"/> <aop:after-returning method="returning" pointcut-ref="pointcut" returning="r"/> <aop:after-throwing method="afterThrowing" pointcut-ref="pointcut" throwing="e"/> <aop:around method="around" pointcut-ref="pointcut"/> </aop:aspect> </aop:config> </beans>
MainXml.java
package org.javaboy.aop; import org.javaboy.aop.service.MyCalculator; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author 鄧雪松 (づ ̄ 3 ̄)づ) * @create 2021-10-28-20-14 */ public class MainXml { public static void main(String[] args) { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); MyCalculator calculator = ctx.getBean(MyCalculator.class); calculator.add(6,7); calculator.min(6,7); } }
完 ~