概述
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
AOP 是一个概念,一个规范,本身并没有设定具体语言的实现,这实际上提供了非常广阔的发展的空间。AspectJ是AOP的一个很悠久的实现,它能够和 Java 配合起来使用。
使用步骤
环境:
jdk 8
spring 5
maven工程
引入依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.4</version>
</dependency>
创建类用于测试
注:由于只是为了测试使用了@Component注解
@Component
public class UserDao {
public void add(){
System.out.println("===== UserDao add 执行 =====");
}
}
创建通知类
@Component
@Aspect
public class UserDaoProxy {
// 前置通知
@Before("execution(* com.atguigu.spring5.dao.UserDao.*(..))")
public void before(){
System.out.println("before...");
}
// 后置通知(返回通知)
@AfterReturning("execution(* com.atguigu.spring5.dao.UserDao.*(..))")
public void afterReturning(){
System.out.println("afterReturning...");
}
// 最终通知
@After("execution(* com.atguigu.spring5.dao.UserDao.*(..))")
public void after(){
System.out.println("after...");
}
// 环绕通知
@Around("execution(* com.atguigu.spring5.dao.UserDao.*(..))")
public void Around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("环绕之前...");
// 被增强方法执行
proceedingJoinPoint.proceed();
System.out.println("环绕之后...");
}
// 异常通知
@AfterThrowing("execution(* com.atguigu.spring5.dao.UserDao.*(..))")
public void afterThrowing(){
System.out.println("afterThrowing...");
}
}
配置文件/配置类中 开启AspectJ
使用的是配置文件
<!-- 开启aspectj -->
<aop:aspectj-autoproxy />
使用的是配置类
@EnableAspectJAutoProxy
测试结果
正常执行:
如果add方法中出现异常:
public void add(){
int i = 1 / 0;
System.out.println("===== UserDao add 执行 =====");
}
Aop切入点语法参考博文:Spring 之AOP AspectJ切入点语法详解
Aop通知注解详细参考博文:Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置