后面几天介绍了 Spring,IOC 容器,bean 的生命周期和初始化及销毁过程,注解的应用。
明天介绍一节纯干活,AOP 的实现原理,看完这一篇,面试过程中,再也不要和面试官尬聊:面向切面编程!援用场景在日志,办法加强等等方面!
本文通过对 AOP 是什么,应用场景,实现原理等方面,联合代码等形式图文介绍,用最简短的语言文字描述,彻底把握 AOP 的应用形式,面试中介绍 AOP 时跟面试官娓娓而谈,面试官只会对你说一个字:牛逼!
一、AOP 介绍
AOP:面向切面编程【底层就是动静代理】,指程序在运行期间动静的将某段代码切入到指定办法地位进行的编程形式。
应用 AOP 有什么益处?
场景:例如定义一个办法,办法中要计算两者相除,办法中须要验证被除数的数据是否合乎逻辑(比方不能为 0),咱们当然能够通过 if 条件形式将逻辑解决好。然而代码略显臃肿,此时能够通过引入 AOP,在执行计算之前将判断逻辑解决好,以及在运算之后将对应的后置相干逻辑也加上,这样不仅不须要在代码中写大量的 if 等逻辑代码,而且通过这种形式,对办法进行对立封装援用。
接下来进行实例演示
建设配置类
在 pom.xml 中引入 spring-aspects 依赖
新建实体类 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 极客思维
微信扫一扫,关注公众号