AspectJ是目前最流行的AOP框架。
本例採用註解的方式實現前置通知,xml配置方式稍後講解
//接口java
public interface Calculator { int add(int i,int j); int sub(int i,int j); }
//接口實現類spring
@Component public class CalculatorImpl implements Calculator{ @Override public int add(int i, int j) { int result = i+j; return result; } @Override public int sub(int i, int j) { int result = i-j; return result; } }
//切面類app
package com.test.aop.impl; import java.util.Arrays; import java.util.List; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; /** * 切面類 * 1.須要將該類放入到IOC容器中 * 2.再將它申明爲一個切面 */ @Aspect @Component public class LoggingAspect { //聲明該方法是一個前置通知 //在以下方法開始執行以前執行 @Before("execution(public int com.test.aop.impl.CalculatorImpl.add(int, int))") public void beforeMethod(JoinPoint joinPoint) { //獲取方法名 String methodName = joinPoint.getSignature().getName(); //獲取方法參數 List<Object> args = Arrays.asList(joinPoint.getArgs()); System.out.println("The method" + methodName + "begin"+args); } //後置通知 //目標方法執行以後(不管是否發生異常),執行的通知 @After("execution(* com.test.aop.impl.CalculatorImpl.*(int,int))") public void afterMethod(JoinPoint joinPoint) { //獲取方法名 String methodName = joinPoint.getSignature().getName(); System.out.println("The method" + methodName + "end"); } }
//main方法框架
public class Main { @SuppressWarnings("resource") public static void main(String[] args) { ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Calculator calculator = ctx.getBean(Calculator.class); int result = calculator.add(1, 2); System.out.println(result); } }
//xml配置文件ide
<!-- 自動掃描包 --> <context:component-scan base-package="com.test.aop.impl"></context:component-scan> <!-- 使AspectJ註解起做用,爲匹配的類生成代理對象 --> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
//輸出結果代理
The methodaddbegin[1, 2] The methodaddend 3