前言
项目中会有些业务情况需要手写一个切面来完成。
- 完成一个操作日志的记录需求,记录某些对用户增删改的触发条件
- 对异常进行拦截,记录异常发生的时间以及ip地址等等
- 对某些特定的接口加上权限的校验
以上功能均可以通过AOP来简单的做一个实现
下面演示的是如何自定义一个注解,只要加上了这个注解就走我的业务逻辑
1、定义注解
2、定义切面(切点就是这个注解,加个这个注解就走我的切面)
此处实现的是你要写的业务逻辑,可以理解为普通的业务层。@Pointcut 就是切点,指的是什么时候走我的这个业务逻辑
我此处的切点定义的就是我刚才自己写的注解,当某些方法加上我的注解就走该业务逻辑
3、写切面的逻辑,此时是环绕还是前置还是后置自己考虑(根据实际业务情况)
此处根据自己的业务逻辑去判断该用什么类型的通知
前置通知:执行加了切面本方法前执行该业务逻辑
后置通知:执行加了切面的本方法后执行该业务逻辑
环绕通知:执行前和执行后均执行该业务逻辑
此处我用的环绕通知@Around
4、在需要走切面的地方(方法 或 controller 上加上这个注解)
5、如果想在自定义注解里面传值,在切面里面获取值也是可以的
PS:如果是上面说的第二个问题(对异常进行拦截,记录异常发生的时间以及ip地址等等)这种不需要你去自定义注解的,我们的切点就是 Exception.class 那么只要写个切面就好无需自定义注解
附上关于AOP的面试题,自己面试总结的一些
如何谈谈AOP呢需要从以下几点
1. AOP的优点(能干什么)
在日常工作中经常会遇到重复性的代码比如说日志,事务,我们需要在很多类里面同时把这些代码全部写进去,这样的话是非常非常麻烦的,我们可以把这些共有的代码抽象出来,把他切入到我们想要切入的类里面,这样的话极大的方便了我们代码的书写,减少了冗余代码,提高了代码的复用性,对于后期代码的扩展性也很有帮助,(不需要修改源代码)
2. AOP的实现方式(以及具体如何写)
AOP的两种实现方式:Acspectj和SchemaBased
Schema-base缺点一个通知一个类 一个类里一个方法,类比较多
每一个通知都去实现一个接口,通过接口的方式判断是什么通知
Schema-base优点:可以自由的获取切点的所有参数,方法,所在类等信息,不用自己获得
Aspectj是把所有通知放在一个类里面,是通过xml标签来确定是什么通知
Aspectj优点,书写非常简单
Aspectj缺点,获取切点参数等信息困难,比较麻烦。
3. AOP的底层原理
底层原理的实现是依靠动态代理实现的,如果我们要代理的这个对象它有接口那我们就是用java原生的jdk动态代理来实现这个动态代理的创建,如果他是基于类的,他会采用cglib的技术来实现动态代理的创建(Spring会自动在两种代理之间自由切换,也可以通过xml配置文件自己配,可以通过proxy-target-class修改)。在我们项目中AOP和IOC是无处不在这也是Spring火了这么多年的原因