AOP就是面向特定的方法进行编程,在不改动原始方法的基础上,可以增强原始方法的功能,或者改变某些功能,我们可以通过AOP记录数据库的操作日志
AOP的底层实现就是动态代理技术,在执行原始方法前,生成一个代理方法,并对原始方法进行增强,就是把通知方法里的逻辑加入进去,最后执行的是代理后的增强方法,
使用AOP首先在pom文件导入相应坐标
编写AOP程序:
@Component表示将该类交给ioc容器进行管理
@Aspect表示该类是AOP类
@Around和@Before,@After,@AfterReturning,@AfterThrowing是五大通知注解,里面的切入点表达式是针对哪些方法进行AOP编程
1.通知
注意,环绕通知是最特别的通知,它注释的方法必须是Object类型,因为它要定义连接点ProceedJoinPoint来调用原始方法,来接收原始方法的返回值,且返回方法执行后的Object对象
其他通知不需要考虑原始方法执行
不同通知之间存在默认的执行顺序,环绕通知前,前置通知,返回后通知,后置通知,环绕后通知
或 环绕通知前,前置通知,异常后通知,后置通知
相同通知之间也有默认的执行顺序,按照切面类的自然排序执行,即字母排序大小,如果不想这样执行,可以添加@Order注解指定执行优先级,优先级是@Order属性的数字大小,越小越先执行
2.切入点PointCut
切入点定义了匹配连接点的条件,将公共的切入点表达式抽取出来。
可以这样定义一个切入点方法,这样其他通知可以不再使用execution来配置相同的切入点表达式,直接用对应的切入点方法就好,但注意这个切入点方法的访问修饰符类型,private只能在本类中使用,在外部的切面类使用,则需要更大的访问权限。
3.切入点表达式
该表达式就是决定哪些方法需要加入通知中
第一种方法通过execution,根据方法的签名匹配
一般都会省略访问修饰符,返回值和异常,但不要省略包名和类名,注意如果不省略方法参数,该参数的路径必须写全限定路径,而且尽量缩小切入点的匹配范围
当要匹配多个方法,则可以使用 || ,&&,!来组合复杂的表达式
第二种方法通过@annotation,表示匹配有特定注解的方法
先自定义一个注解,添加@Retention,表示该注解什么时候生效
@Target表示该注解可以应用在什么地方,比如可以应用在方法上。
然后在对应的原始方法上添加自定义注解,我这里是@MyLog
然后用annotation来替换execution,即匹配方法上添加了@MyLog注解的原始方法
4.连接点,就是被AOP控制的方法
以上是around环绕通知获取原始方法的相关信息,其他通知方法只需换JoinPoint来获取即可,对应的api一样的