什么是Aop?
Aop:Aspect Oriented Programming:面向切面编程,是对OOP思想的一种补充. 本质上就是利用动态代理技术,去对现有功能进行扩充的一种方式. 横切技术. OOP:面向对象编程:纵向扩张,AOP;横向扩张;
解决共性问题:比如:权限管理 日志记录 验证 事务操作
Aop术语:
Aspect: 切面; 公共模块; 对应的类
Advice: 通知(增强), 切面中的方法 ;要扩展的功能;
Join Point:连接点,通知要接入的业务系统的方法
Pointcut :切入点,对一系列连接的描述(表达式)
切入点表达式举例:
通知分类
Before advice:前置通知, 在连接点对应的业务方法之前执行的功能.
After returning advice:正常返回通知,在连接点对应的业务方法正常执行后执行的功能;如果发生异常,该通知不执行.
After throwing advice: 异常通知,在连接点对应的业务方法发生异常时执行的通知.如果不发生异常,不执行;
After (finally) advice:后置(最终)通知,连接点对应的业务方法,无论是否发生异常,该通知都会执行.
Around advice: 环绕通知.
常用切入点:
以下示例显示了一些常见的切入点表达式:
执行任何公共方法:
execution(public * *(..))
执行名称以以下开头的任何方法 set :
execution(* set*(..))
执行 AccountService 接口定义的任何方法:
execution(* com.xyz.service.AccountService.*(..))
执行 service 包中定义的任何方法:
execution(* com.xyz.service.*.*(..))
执行服务包或其子包中定义的任何方法:
execution(* com.xyz.service..*.*(..))
服务包中的任何连接点(仅在Spring AOP中执行方法):
within(com.xyz.service.*)
服务包或其子包中的任何连接点(仅在Spring AOP中执行方法):
within(com.xyz.service..*)
代理实现 AccountService 接口的任何连接点(仅在Spring AOP中执行方法) :
this(com.xyz.service.AccountService)
目标对象实现 AccountService 接口的任何连接点(仅在Spring AOP中执行方法):
target(com.xyz.service.AccountService)
aop实现原理分析
- jdk动态代理
- cglib代理
基于xml的方式实现aop
基于注解的方式实现aop
1、开启注解
<aop:aspectj-autoproxy/>
2、在切面类中配置相应的注解:
@Aspect
@Component
注意:异常和环绕不能一块出现。