AOP注解使用必要配置

在进行 AOP 注解配置前我们需要先在我们的配置文件中加入如下配置:

 <context:component-scan base-package="cn.zhuoqianmingyue.aop"></context:component-scan><aop:aspectj-autoproxy />

context:component-scan 用于Spring扫描 注解配置的路径。
aop:aspectj-autoproxy 用于添加aop 注解配置支持

声明切面

通过在切面类(通知类)上声明@Aspect() 来指定其实 切面类。例如:

@Component
@Aspect()
public class CustomAspect {...............
}

声明切入点

通过在切面类(通知类)中的方法上声明@Pointcut 声明公共切入点,配置示规则下:

@Pointcut(value="切入点表达式", argNames = "通知参数列表参数名")

配置示例:

@Pointcut(value="execution(* *..*.*(..))")
public void forAll() {};

需要注意的是我们切入点方法定义成一个空方法体即可,这里的方法名称可以随意定义。

声明通知

Spring 注解的方式也是支持 5中通知类别的。

before

我们通过在切面类中的方法上声明 @Before 来设置 通知类别为Before的通知。配置示规则下:

@Before(value = "公共切入点方法名称或者切入点表达式",argNames="通知参数列表参数名")

配置示例:

 @Pointcut(value="execution(* *..*.*(..)) && args(param)", argNames = "param")  public void beforeWithParamPointcut2(String param) {}  @Before(value = "beforeWithParamPointcut2(param)", argNames = "param")  public void beforeWithParam(String param) {  System.out.println("beforeWithParam.... param value:" + param);  }

after

我们通过在切面类中的方法上声明 @After 来设置 通知类别为After的通知。配置示规则下:

@After(value = "公共切入点方法名称或者切入点表达式",argNames="通知参数列表参数名")

配置示例:

@After(value = "execution(* *..*.*(..))")public void after() {System.out.println("after.......");  }

afterRetruning

我们通过在切面类中的方法上声明 @AfterReturning 来设置 通知类别为AfterReturning 的通知。配置示规则下:

 @AfterReturning(  value="公共切入点方法名称或者切入点表达式",  pointcut="切入点表达式",  argNames="通知参数列表参数名", returning="通知参数列表参数名")

pointcut 优先级高于value

配置示例:

 @AfterReturning(  value="execution(* *..*.*(..))",  pointcut="execution(* *..*.*(..))",  argNames="retVal", returning="retVal")  public void afterReturning(Object retVal) {  System.out.println("afterReturning..... advice retVal:" + retVal);  }

afterThrowing

我们通过在切面类中的方法上声明 @AfterThrowing来设置 通知类别为AfterThrowing的通知。配置示规则下:

@AfterThrowing(
value="公共切入点方法名称或者切入点表达式",
pointcut="公共切入点方法名称或者切入点表达式",
argNames="通知参数列表参数名",
throwing="异常参数的名称")

配置示例:

 @AfterThrowing(value="forAll()",  argNames="exception", throwing="exception")public void afterThrowing(Exception exception) {System.out.println("after throwing exception:" + exception);  }

around

我们通过在切面类中的方法上声明 @Around 来设置 通知类别为Around的通知。配置示规则下:

@Around(value = "公共切入点方法名称或者切入点表达式",argNames="通知参数列表参数名")

配置示例:

@Around(value="execution(* *..*.*(..))")  public Object around(ProceedingJoinPoint pjp) throws Throwable {Object[] args = pjp.getArgs();System.out.println("around before........");Object retVal = pjp.proceed(args);System.out.println("around after.......");return retVal;}

demo 案例测试

在介绍完具体配置后我们通过一个简单的测试demo 进行AOP 注解配置演示,首先我们先定义我们的切面类(通知类)具体代码如下:

@Pointcut(value="execution(* *..*.*(..))")  public void forAll() {};@Before(value = "forAll()")public void before(){System.out.println("before....");}@Before(value = "execution(* *..*.*(..))")public void before2(){System.out.println("before2....");}@Pointcut(value="execution(* *..*.speak(..)) && args(param)", argNames = "param")  public void beforeWithParamPointcut(String param) {}@Pointcut(value="execution(* *..*.*(..)) && args(param)", argNames = "param")  public void beforeWithParamPointcut2(String param) {}  @Before(value = "beforeWithParamPointcut2(param)", argNames = "param")  public void beforeWithParam(String param) {  System.out.println("beforeWithParam.... param value:" + param);  }@After(value = "forAll()")public void after() {System.out.println("after.......");  }@AfterReturning(  value="execution(* *..*.*(..))",  pointcut="execution(* *..*.*(..))",  argNames="retVal", returning="retVal")  public void afterReturning(Object retVal) {  System.out.println("afterReturning..... advice retVal:" + retVal);  }@AfterThrowing(value="forAll()",  argNames="exception", throwing="exception")public void afterThrowing(Exception exception) {System.out.println("after throwing exception:" + exception);  }@Around(value="execution(* *..*.*(..))")  public Object around(ProceedingJoinPoint pjp) throws Throwable {Object[] args = pjp.getArgs();System.out.println("around before........");Object retVal = pjp.proceed(args);System.out.println("around after.......");return retVal;}

目标类:

@Component
public class User {public void run() {System.out.println("run....");}public void speak(String name) {System.out.println(name+"run....");}public int add(int a,int b) {return a+b;}
}

测试类:

public class UserTest {@Testpublic void run() {ApplicationContext appliction = new ClassPathXmlApplicationContext("ioc-aop-annotationConfiguration.xml");User user = (User)appliction.getBean("user");user.run();}@Testpublic void speak() {ApplicationContext appliction = new ClassPathXmlApplicationContext("ioc-aop-annotationConfiguration.xml");User user = (User)appliction.getBean("user");user.speak("hello !");}@Testpublic void add() {ApplicationContext appliction = new ClassPathXmlApplicationContext("ioc-aop-annotationConfiguration.xml");User user = (User)appliction.getBean("user");user.add(3,4);}
}

run 方法测试结果:

speak方法测试结果:

add方法的测试结果:

查看具体源码

Spring AOP之注解配置篇相关推荐

  1. Java框架篇---spring aop两种配置方式

    Java框架篇---spring aop两种配置方式 第一种:注解配置AOP 注解配置AOP(使用 AspectJ 类库实现的),大致分为三步:  1. 使用注解@Aspect来定义一个切面,在切面中 ...

  2. Spring Aop 常见注解和执行顺序

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:juejin.cn/post/7062506923194581029 Spring 一开始最强大的就是 IOC / AOP 两 ...

  3. Spring JDBC-使用注解配置声明式事务

    系列 概述 使用Transactional注解 txannotation-driven其他属性 关于Transaction的属性 在何处标注Transactional注解 在方法处使用注解 使用不同的 ...

  4. [10] AOP的注解配置

    1.关于配置文件 首先在因为要使用到扫描功能,所以xml的头文件中除了引入bean和aop之外,还要引入context才行: <?xml version="1.0" enco ...

  5. spring AOP自定义注解方式实现日志管理

    转:spring AOP自定义注解方式实现日志管理 今天继续实现AOP,到这里我个人认为是最灵活,可扩展的方式了,就拿日志管理来说,用Spring AOP 自定义注解形式实现日志管理.废话不多说,直接 ...

  6. java @around,Spring AOP基于注解的Around通知

    是一种建议类型,可确保方法执行前后的通知可以运行. 以下是通知的语法: 语法 @Pointcut("execution(* com.yiibai.Student.getAge(..))&qu ...

  7. Spring 4 xml 注解配置谅解 spring

    2019独角兽企业重金招聘Python工程师标准>>> Spring 4 xml 注解配置谅解 博客分类: spring <Spring in Action>4th Ed ...

  8. spring aop 自定义注解配合swagger注解保存操作日志到mysql数据库含(源码)

    spring aop 自定义注解保存操作日志到mysql数据库 一.思路 二.自定义注解 三.编写操作日志 四.编写操作日志切面\增强 五.使用 六.`注意` 一.思路 利用spring aop 对方 ...

  9. spring事务管理-注解配置aop事务(重点)

    导包,导入新的约束,通知都不用配了,这两个是一样的,导包这一步,新的约束,tx这些都是一样的,第三步开始不同,这个注解配置大概一分钟就讲完了,第三步咱们可以开启注解,管理事务,那这块的话,咱们的配置文 ...

最新文章

  1. 高级代码编辑器:sublime text 4 for Mac
  2. mysql左右连接举例_MYSQL 连接举例
  3. cocos2d-x和objective-c中的retain()和release()
  4. 超级硬盘数据恢复软件v2.7.2.6_电脑磁盘上的视频误删如何恢复?误删视频恢复教程...
  5. DVM的进程和Linux的进,下面关于Android dvm的进程和Linux的进程,应用程序的进程说法正确的是()...
  6. 太慢不能忍!CPU 又拿硬盘和网卡开刀了!
  7. idea tab页签颜色不明显,自定义颜色解决。
  8. c99数组稀疏初始化
  9. libjvm ThreadState Transition transition_from_native
  10. 二维码内容过多,生成的二维码太复杂,导致扫码的时候,过慢或者扫不出来解决方案。附二维码生成、解析工具类
  11. android清理软件评测,四大垃圾清理软件横向评测
  12. 基于SSH商场管理系统
  13. 业大宗商品价格简史:经验总结与未来展望-20210107.PDF
  14. supermap 模型导入纹理丢失解决方法
  15. 生活大爆炸版石头剪刀布-简单模拟
  16. [文献阅读]——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
  17. 解决Failed to load resource: net::ERR_INCOMPLETE_CHUNKED_ENCODING
  18. 明星“真空”出镜上直播,这戏该如何继续演?
  19. VLC多媒体播放器将字幕srt等 内嵌在视频中且能合并到视频,保存为带字幕的新视频 自媒作首选工具
  20. 使用模板快速制作H5网页(仅供参考)

热门文章

  1. jsp中能循环div吗_中药面膜安全靠谱吗?
  2. mysql导入报编码错误问题解决
  3. 计算机信息管理试卷答案,计算机信息管理专业《计算机组成原理》试卷B和参考答案4...
  4. delphi 选择文件夹目录_系统小技巧:不装软件 批处理为文件夹加锁
  5. OpenShift 4 - 安全上下文 SecurityContext
  6. OpenShift4 - 使用 Service CA 证书增加内部通讯安全
  7. abp vnext中swagger使用小结
  8. Abp vnext 特征(Features)
  9. 谷歌推出 Kotlin 免费在线课程
  10. java流被关闭后怎样重新打开,java – 如何停止MediaPlayer流然后重新启动它? Android的...