1.接口
package com.sunyu.spring; public interface Calculator { int add(int i,int j); int sub(int i,int j); int mul(int i,int j); int div(int i,int j); }
2.实现类
package com.sunyu.spring; import com.sunyu.spring.Calculator; import org.springframework.stereotype.Component; @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; } @Override public int mul(int i, int j) { int result = i*j; return result; } @Override public int div(int i, int j) { int result = i/j; return result; } }
3.日志类
package com.sunyu.spring; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; import java.util.Arrays; @Component @Aspect @Order(在此中输入数字可以代表异常通知的优先级,1为最大) /** * aspect注解用来是的ioc了解该组件为切面组件 * */ public class LoggerAspect { // 将切入点统一设置在一个方法内 // 之后在通知中使用注解调用方法 @Pointcut("execution(* com.sunyu.spring.*.*(..)))") public void PointCut(){} @Before("PointCut()") // 获取连接点所对应方法的信息:前置通知 public void beforeAdviceMethod(JoinPoint joinPoint){ // 获取连接点所对应的签名信息(即方法的声明信息) Signature signature = joinPoint.getSignature(); Object[] args = joinPoint.getArgs(); System.out.println(signature.getName()+","+ Arrays.toString(args)); } // 后置通知 @After("PointCut()") public void afterAdviceMethod(){ System.out.println("运行结束"); } // 返回通知 @AfterReturning("PointCut()") public void afterRunningAdviceMethod(){ System.out.println("运行完毕"); } // 异常通知 @AfterThrowing(value = "PointCut()",throwing ="ex") public void afterThrowAdviceMethod(JoinPoint joinPoint,Exception ex){ System.out.println("方法"+joinPoint.getSignature().getName()+"异常:"+ex); } // 环绕通知:前面四种通知综合 @Around("PointCut()") public Object aroundAdviceMethod(ProceedingJoinPoint joinPoint){ Object result=null; Object[] args = joinPoint.getArgs(); try { System.out.println("前置通知"+joinPoint.getSignature().getName()+","+Arrays.toString(args)); result= joinPoint.proceed(); System.out.println("返回通知:程序未出现error,成功运行"); } catch (Throwable e) { e.printStackTrace(); System.out.println("异常通知:方法:"+joinPoint.getSignature().getName()+"异常信息:"+e); System.out.println(); } finally { System.out.println("后置通知"); } return result; } } 注意:@around和前面四中通知方法选择一种即可,@around是前面四种方法的综合。
4.pom.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:context="http://www.springframework.org/schema/context" 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/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd "> <!-- "http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd"--> <!-- AOP配置注意事项: 切面类和目标类都交给ioc容器管理 @Component注解适合加载不是控制层不是持久层不是业务层的类上 @Before("execution(public int com.sunyu.spring.CalculatorImpl.add(int,int))") @Before("execution(* com.sunyu.spring.*.*(..))") 从左向右: 第一个*代表任意修饰符的返回值 第二个*代表类中包下所有的类 第三个*代表类中所有的方法 ..代表任意的参数列表 获取连接点所对应方法的信息 * 第一个* --> <context:component-scan base-package="com.sunyu.spring"></context:component-scan> <aop:aspectj-autoproxy/> </beans>
5.测试类:
import com.sunyu.spring.Calculator; import org.junit.Test; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AopTEXT { @Test public void text(){ ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("aop.xml"); Calculator bean = ioc.getBean(Calculator.class); int add = bean.div(1, 0); System.out.println(add); } }