1 package SpringAopImp; 2 3 public interface Calculator { 4 int add(int i, int j); 5 int sub(int i, int j); 6 int mul(int i, int j); 7 int div(int i, int j); 8 }
1 package SpringAopImp; 2 3 4 import org.springframework.stereotype.Component; 5 6 @Component 7 public class CalculatorImp implements Calculator { 8 9 @Override 10 public int add(int i, int j) { 11 int result=i+j; 12 System.out.println("Method is Running"); 13 return result; 14 } 15 16 @Override 17 public int sub(int i, int j) { 18 int result=i-j; 19 return result; 20 } 21 22 @Override 23 public int mul(int i, int j) { 24 int result=i*j; 25 return result; 26 } 27 28 @Override 29 public int div(int i, int j) { 30 int result=i/j; 31 return result; 32 } 33 }
1 package SpringAopImp; 2 3 import org.aspectj.lang.JoinPoint; 4 import org.aspectj.lang.annotation.*; 5 import org.springframework.stereotype.Component; 6 7 import java.util.Arrays; 8 import java.util.List; 9 10 //把这个类声明为一个切面:1、把该类放入到IOC容器中 11 12 @Component 13 @Aspect 14 public class LoggingAspect { 15 16 //前置通知在目标方法开始前执行 17 @Before("execution(public int SpringAopImp.CalculatorImp.add(int ,int))") 18 public void beforeMethod(JoinPoint joinPoint) { 19 String methodName = joinPoint.getSignature().getName(); 20 List<Object> args = Arrays.asList(joinPoint.getArgs()); 21 System.out.println("The Method:" + methodName + " beginWith:" + args); 22 } 23 24 //后置通知,在目标方法开始后执行,无论方法是否发生异常 25 @After("execution(public int SpringAopImp.CalculatorImp.add(int ,int))") 26 public void afterMethod(JoinPoint joinPoint) { 27 String methodName = joinPoint.getSignature().getName(); 28 System.out.println("The Method:" + methodName + " ends"); 29 } 30 31 //返回通知,在目标方法正常结束后执行的代码,返回通知是可以返回方法的返回值的 32 @AfterReturning(value = "execution(public int SpringAopImp.CalculatorImp.add(int ,int))", returning = "result") 33 public void afterReturning(JoinPoint joinPoint, Object result) { 34 String methodName = joinPoint.getSignature().getName(); 35 System.out.println("The Method:" + methodName + " endsWith:" + result); 36 } 37 38 /* 39 * 异常通知,在目标方法出现异常的时候,调用代码 40 * 可以访问异常对象;且可以指定在出现特定异常时在执行通知代码 41 * */ 42 @AfterThrowing(value = "execution(public int SpringAopImp.CalculatorImp.add(int ,int))", throwing = "ex") 43 public void afterThrowing(JoinPoint joinPoint, Exception ex) { 44 String methodName = joinPoint.getSignature().getName(); 45 System.out.println("The Method :" + methodName + "has Exception: " + ex); 46 } 47 48 }
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 7 8 <context:component-scan base-package="SpringAopImp"></context:component-scan> 9 <!--使 AspectJ注解起作用 :自动为匹配的类生成代理对象--> 10 <aop:aspectj-autoproxy></aop:aspectj-autoproxy> 11 </beans>
1 package SpringAopImp; 2 3 import org.springframework.context.support.ClassPathXmlApplicationContext; 4 5 public class Main { 6 public static void main(String[] args) { 7 ClassPathXmlApplicationContext ctx= new ClassPathXmlApplicationContext("SpringAopImp/SpringAopImp.xml"); 8 Calculator calculatorImp = (Calculator) ctx.getBean("calculatorImp"); 9 System.out.println(calculatorImp.getClass().getName()); 10 System.out.println(calculatorImp.add(1,3)); 11 } 12 }