面试中AOP这样说,面试官只有一个字:服!

前面几天介绍了Spring,IOC容器,bean的生命周期和初始化及销毁过程,注解的使用。java

今天介绍一节纯干活,AOP的实现原理,看完这一篇,面试过程当中,不再要和面试官尬聊:面向切面编程!引用场景在日志,方法加强等等方面!面试

本文经过对AOP是什么,使用场景,实现原理等方面,结合代码等方式图文介绍,用最简短的语言文字描述,完全掌握AOP的使用方式,面试中介绍AOP时跟面试官侃侃而谈,面试官只会对你说一个字:牛逼!spring

1、AOP介绍编程

AOP:面向切面编程【底层就是动态代理】,指程序在运行期间动态的将某段代码切入到指定方法位置进行的编程方式。微信

使用AOP有什么好处?测试

场景:例如定义一个方法,方法中要计算二者相除,方法中须要验证被除数的数据是否符合逻辑(好比不能为0),咱们固然能够经过 if 条件方式将逻辑处理好。可是代码略显臃肿,此时能够经过引入AOP,在执行计算以前将判断逻辑处理好,以及在运算以后将对应的后置相关逻辑也加上,这样不只不须要在代码中写大量的 if 等逻辑代码,并且经过这种方式,对方法进行统一封装引用。spa

接下来进行实例演示代理

创建配置类日志

在pom.xml中引入spring-aspects依赖xml

新建实体类Calculator.java

在Calculator的div()方法运行以前,记录一下日志,运行后也记录一下日志,若是运行出异常,也将异常打印一下。可能实现的方式就会在方法体中每个都写上相应的代码,这样方法多了,会显得很是的冗余及耦合。

此时须要一个日志切面类,来将好比日志等方法进行统一管理。

日志切面类的方法须要动态感知到div()方法运行到哪里了,而后再执行,若是除法开始,就日志开始方法,也叫通知方法,分如下几种:

    前置通知:logStart(),在目标方法(div)运行以前运行 (@Before)

    后置通知:logEnd(),在目标方法(div)运行结束以后运行,不管正常或异常结束 (@After)

    返回通知:logReturn,在目标方法(div)正常返回以后运行 (@AfterReturning)

    异常通知:logException,在目标方法(div)出现异常后运行(@AfterThrowing)

    环绕通知:以上没写,动态代理,手动执行目标方法运行joinPoint.procced(),最底层通知,手动指定执行目标方法(@Around),执行以前至关于前置通知,执行以后至关于返回通知,其实就是经过反射执行目标对象的链接点处的方法。

给日志切面类LogAspect的方法标注什么时候运行(即通知注解)

怎么加入呢?

Spring没法区别【切面类】,哪一个是业务类,在这里给LogAspects类加上@Aspect注解便可声明为切面类。

同时,若不想区分切入了哪一个方法及参数类型和个数,能够有以下指定方式:

在这里又发现问题:注解里的内容是冗余重复的, 公共的代码应该抽出来封装

有了以上操做, 咱们还须要将切面类和被切面的类, 都加入到容器中,在配置类中引入

是否是就完了呢?并无

须要开启基于注解的AOP模式

给配置类中加@EnableAspectJAutoProxy[必定得加上,关键]

注意:在spring之后会有不少@EnableXXXX,表示开启某项功能,取代XML配置

测试一下:新建一个测试类Cap10Test.java

同窗们在测试的过程当中,应该怎么测?很容易出问题。

你们可能会这么写:

没用到容器,确定是不行的,获取bean时使用IOC容器取出bean

总结:

AOP看起来很麻烦, 只要3步就能够了:

1. 将业务逻辑组件和切面类都加入到容器中, 告诉spring哪一个是切面类(@Aspect)

2. 在切面类上的每一个通知方法上标注通知注解, 告诉Spring什么时候运行(写好切入点表达式,参照官方文档)

3. 开启基于注解的AOP模式  @EableXXXX

小伙伴们能够看到,不管是在工做中,仍是面试回答中,对AOP仅仅停留在面向切面编程层面上是远远不够的,还须要深刻对里面的流程进行了解,本文针对AOP的原理,实现方式进行了介绍,但愿后续小伙伴在工做和面试中经过本文AOP的介绍,对AOP的引用可以更加灵活,​面试回答更加游刃有余。

下一篇将深刻到AOP源码,对AOP进行深刻解析。

若是以为好的话,能够关注,点赞和转发呀~

关注微信公众号【Java极客思惟】

Java极客思惟

微信扫一扫,关注公众号

相关文章
相关标签/搜索