- 切面(Aspect):切面用于组织多个Advice,Advice放在切面中定义
- 连接点(Joinpoint):程序执行过程中明确的店,如方法的调用,或者异常的抛出。在SpringAOP中,连接点总是方法的调用
- 增强处理(Advice):AOP框架在特定的切入点执行的增强处理。处理有“around”、“before”、“after”等类型
- 切入点(Ponitcut):可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理。该连接点也就变成了切入点
- 引入:将方法或字段添加到被处理的类中
- 目标对象:被AOP框架进行增强处理的对象。如果AOP框架采用的是动态代理AOP实现,那么该对象就是一个被代理的对象
- AOP代理:AOP框架创建的对象,简单地说,代理就是对目标对象的加强
- 织入:将增强处添加到目标对象中,并创建一个被增强的对象的过程就是织入
业务类
public class Calculator { //业务逻辑方法 做除法 public int div(int i,int j){ System.out.println("-------"); return i/j; } }
切面类
@Aspect public class LogAspects { @Pointcut("execution(public int cn.qin.aop.Calculator.*(..))") public void pointCut(){} // @before 表示在目标方法执行前切入,并指定在哪个方法切入 @Before("pointCut()") public void logStart(JoinPoint joinPoint){ System.out.println("除法运行....参数列表是:{"+ Arrays.asList(joinPoint.getArgs()) +"}"); } @After("pointCut()") public void logEnd(){ System.out.println("除法结束"); } @AfterReturning(value = "pointCut()",returning ="result") public void logReturn(Object result){ System.out.println("除法正常返回...运行结果是 :{"+result+"}"); } @AfterThrowing(value = "pointCut()",throwing = "exception") public void logExcepton(Exception exception){ System.out.println("运行异常 ...异常信息是:{"+exception+"}"); } @Around("pointCut()") public Object Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable{ System.out.println("@around执行目标方法之前.."); Object obj=proceedingJoinPoint.proceed(); System.out.println("@around执行目标方法之后.."); return obj; } }
配置类
* * 日志切面类的方法需要动态感知div()方法运行 * 通知方法: * 前置通知:logStart() 在我们执行div()除法之前运行 (@Before) * 后置通知:LogEnd() 在我们执行目标方法div运行结束之后,不管有没有异常 (@After) * 返回通知: LogReturn() 在我们的目标方法div正常返回值后(@AfterReturning) * 异常通知: LogException() 在我们的目标方法div出现异常后运行(@AfterThrowing) * 环绕通知: 动态代理,执行joinPoint.Procced() (其实就是执行我们的目标方法div)执行之前div()相当于前置通知,执行之后相当于后置通知 (@Around) * * */ @Configuration @EnableAspectJAutoProxy public class MainConfig { @Bean public Calculator calculator(){ return new Calculator(); } @Bean public LogAspects logAspects(){ return new LogAspects(); } }
测试
@Test public void test1(){ AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(MainConfig.class); Calculator c=context.getBean(Calculator.class); System.out.println(c.div(3,1)); context.close();