博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring AOP前置通知和后置通知
阅读量:6932 次
发布时间:2019-06-27

本文共 3613 字,大约阅读时间需要 12 分钟。

hot3.png

Spring AOP

  AspectJ:Java社区里最完整最流行的AOP框架
  在Spring2.0以上的版本中,可以使用基于AspectJ注解或基于XML配置的AOP

在Spring中启用AspectJ注解支持
  要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar、aspectj.weaver.jar和spring-aspects.jar
  将aop Schema添加到<beans>根元素中。
  要在Spring IOC容器中启用AspectJ注解支持,只要早bean配置文件中定义一个空的XML元素<aop:aspectj-autoproxy>
  当Spring IOC容器侦测到bean配置文件中的<aop:aspectj-autoproxy>元素时,会自动为与AspectJ切面匹配的bean创建代理
用AspectJ注解声明切面
  要在Spring中声明AspectJ切面,只需要在IOC容器中将切面声明为bean实例。当在Spring IOC容器中初始化AspectJ切面之后,Spring IOC容器就会为那些与AspectJ切面相匹配的bean创建代理
  在AspectJ注解中,切面只是一个带有@AspectJ注解的Java类
  通知是标注有某种注解的简单的Java方法
  AspectJ支持5种类型的通知注解:
    @Before:前置通知,在方法执行之前返回
    @After:后置通知,在方法执行后执行
    @AfterRunning:返回通知,在方法返回结果之后执行
    @AfterThrowing:异常通知,在方法抛出异常之后
    @Around:环绕通知,围绕着方法执行
利用方法签名编写AspectJ切入点表达式
  最典型的切入点表达式时根据方法的签名来匹配各种方法:
    -execution * com.yl.spring.aop.ArithmeticCalculator.*(..):匹配ArithmeticCalculator中声明的所有方法,第一个*代表任意修饰符及任意返回值,第二个*代表任意方法,..匹配任意数量的参数。若目标类与接口与切面在同一个包中,可以省略包名。
    -execution public * ArithmeticCalculator.*(..):匹配ArithmeticCalculator接口的所有公有方法
    -execution public double ArithmeticCalculator.*(..):匹配ArithmeticCalculator中返回double类型数值的方法
    -execution public double ArithmeticCalculator.*(double, ..):匹配第一个参数为double类型的方法,..匹配任意数量任意类型的参数
    -execution public double ArithmeticCalculator.*(double, double):匹配参数类型为double,double类型的方法
后置通知
  后置通知是在连接点完成之后执行的,即连接点返回结果或者抛出异常的时候,下面的后置通知记录了方法的终止。
  一个切面可以包括一个或者多个通知

LoggingAspect.java

1 package com.yl.spring.aop.impl; 2  3 import java.util.Arrays; 4 import java.util.List; 5  6 import org.aspectj.lang.JoinPoint; 7 import org.aspectj.lang.annotation.After; 8 import org.aspectj.lang.annotation.Aspect; 9 import org.aspectj.lang.annotation.Before;10 import org.springframework.stereotype.Component;11 12 //这个类声明为一个切面:需要把该类放入到IOC容器中;再声明为一个切面13 @Aspect14 @Component15 public class LoggingAspect {16     17     //声明该方法是一个前置通知:在目标方法开始之前执行18     //@Before("execution(public int com.yl.spring.aop.impl.ArithmeticCalculatorImpl.add(int, int))")19     @Before("execution(* com.yl.spring.aop.impl.*.*(..))")20     public void beforeMethod(JoinPoint joinpoint) {21         String methodName = joinpoint.getSignature().getName();22         List args = Arrays.asList(joinpoint.getArgs());23         System.out.println("The method " + methodName + " begins with " + args);24     }25     //后置通知:在目标方法执行后(无论是否发生异常),执行的通知26     //在后置通知中,还不能访问目标方法执行的结果27     @After("execution(* com.yl.spring.aop.impl.*.*(..))")28     public void afterMethod(JoinPoint joinPoint) {29         String methodName = joinPoint.getSignature().getName();30         List args = Arrays.asList(joinPoint.getArgs());31         System.out.println("The method " + methodName + " end with " + args);32     }33     34 }

配置文件applicationContext.xml:

1 
2
9 10
11
12 13
14
15 16

 

测试类:

1 package com.yl.spring.aop.impl; 2  3 import org.springframework.context.ApplicationContext; 4 import org.springframework.context.support.ClassPathXmlApplicationContext; 5  6 public class Main { 7     public static void main(String[] args) { 8          9         ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");10         11         ArithmeticCalculator arithmeticCalculator = ctx.getBean(ArithmeticCalculator.class);12         13         int result = arithmeticCalculator.add(4, 6);14         System.out.println("result: " + result);15         16         result = arithmeticCalculator.mul(4, 6);17         System.out.println("result: " + result);18     } 19 }

 

转载于:https://my.oschina.net/yulei1943/blog/1490709

你可能感兴趣的文章
心路历程
查看>>
如何在Linux单用户模式下修改fstab文件
查看>>
CORS - 跨域资源共享
查看>>
《写给大家看的面向对象编程书》 - 书摘精要
查看>>
掌上师大手机端之问
查看>>
linux文件系统
查看>>
git入门教程
查看>>
JDK1.5,1.6,1.7,1.8新增特性
查看>>
git-jenkins-k8s构建tomcat项目实践
查看>>
sql server考试题
查看>>
centos7 简单安装puppet
查看>>
IOS--UINavigationBar修改背景色
查看>>
独辟蹊径系列 带着大家玩Android
查看>>
js art.dialog删除
查看>>
thinkphp模板中使用函数的方法
查看>>
Spring MVC学习(七)-------SpringMVC数据类型转换
查看>>
Android应用与开发环境
查看>>
找了个生男生女清宫图,感觉挺准的
查看>>
solrcloud 监控
查看>>
Kictstart Pxe 自动安装Linux系统
查看>>