这节内容非常关键,我们会比较详细地介绍Spring AOP注解的使用

1. 要使用Spring AOP注解,必须满足如下的事项

  • 导入Aspectj的jar、Spring3.0-AOP.jar、aopalliance.jar
  • 需要在配置文件中加入注解的配置,例如:bean-aop-annotiation.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:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"> <aop:aspectj-autoproxy></aop:aspectj-autoproxy>
</beans>

如果使用Spring AOP注解,最好的用处就是减少在配置文件中的AOP内容。但是如果要掌握好Spring的AOP还需要学习注解的语法,下面的内容会给大家慢慢介绍

2. 织入点语法

package com.spring.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component; @Aspect
public class LogAop { @Before("execution(public void com.spring.dao.impl.StudentDaoImpl.*(..))")
public void logBefore() {
System.out.println("方法执行之前转载日志");
}
}

execution(public void com.spring.dao.impl.StudentDaoImpl.*(..)),这个就是织入点的语法,它告诉AOP框架哪个类中方法需要进行AOP

3. execution语法介绍

  • execution(public * *(..))
  • execution(* set*(..))
  • execution(* com.xyz.service.AccountService.*(..))
  • execution(* com.xyz.service..*.*(..))
  • 上面只是举例说明了execution的语法,下面是一个标准的语法定义
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern) throws-pattern?)

4. Spring AOP注解例子

  • @Before前置建议,它是在执行一个业务方法之前插入的切面
  • @AfterReturning,它是当一个方法正常运行后,执行的切面
  • @After,它是当方法执行成功或者出现异常的时候都会执行切面
  • @Around,它相当于一个AOP链,如果当前AOP执行后,就让下一个AOP执行
  • @AfterThrowing,如果在方法中有错误抛出,则执行此建议
package com.spring.aop;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component; @Aspect
public class LogAop { @Before("execution(public void com.spring.dao.impl.StudentDaoImpl.*(..))")
public void logBefore() {
System.out.println("方法执行之前转载日志");
} @AfterReturning("execution(public void com.spring.dao.impl.StudentDaoImpl.insert(..))")
public void logAfterReturning() {
System.out.println("方法执行返回后载入日志");
} @After("execution(public * com.spring.dao.impl.StudentDaoImpl.*(..))")
public void logAfter() {
System.out.println("Finally载入日志");
} @Around("execution(public * com.spring.dao.impl.StudentDaoImpl.*(..))")
public Object doBasicProfiling(ProceedingJoinPointpjp) throws Throwable {
System.out.println("===around建议载入日志===" + new Date());
Object o = pjp.proceed();
return o;
} @AfterThrowing("execution(public * com.spring.dao.impl.StudentDaoImpl.*(..))")
public void logAfterThrowing() {
System.out.println("===有参数异常载入日志===" + new Date());
}
}

最新文章

  1. 二叉树[C实现]
  2. OAF_开发系列24_实现OAF更新记录显示Record History(案例)
  3. oracle job的写法
  4. C# NPOI 导入与导出Excel文档 兼容xlsx, xls
  5. 4.PopupWindow
  6. Redis性能测试工具benchmark简介
  7. 黄聪:WordPress 后台发布文章时提示用户选择分类
  8. MySQL5.6 Replication主从复制(读写分离) 配置完整版
  9. Linux配置静态IP
  10. [转] 有趣的JavaScript原生数组函数
  11. 怎么让一个非窗口组件可以接受来自Windows的消息
  12. UWP 绘制图形
  13. 使用UE4/Unity创建VR项目
  14. Linux - grep的一些进阶选项
  15. angularjs1.X进阶笔记(3)——如何重构controller
  16. IIS多个应用程序共享Session
  17. Lambert漫反射的BRDF
  18. 【python014--字符串内置函数】
  19. 比较sql server两个数据库
  20. 2:4 动态方法的调用(简化Action的配置)

热门文章

  1. Symbol类型的应用
  2. 3 Python相对路径地址的的一个问题
  3. CVPR2020论文点评: AdderNet(加法网络)
  4. Mobileye 自动驾驶策略(一)
  5. 计图(Jittor) 1.1版本:新增骨干网络、JIT功能升级、支持多卡训练
  6. RGB-D对红外热像仪和毫米波雷达标定
  7. C++标准模板库(STL)——queue常见用法详解
  8. Appium UI自动化测试
  9. 并发王者课-铂金2:豁然开朗-“晦涩难懂”的ReadWriteLock竟如此妙不可言
  10. .NET Core/.NET5/.NET6 开源项目汇总2:任务调度组件