前面几天介绍了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的引用能够更加灵活,​面试回答更加游刃有余。

(感谢来自享学IT老师们的分享)

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

如果觉得好的话,可以关注,点赞和转发呀~

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

Java极客思维

微信扫一扫,关注公众号

面试中AOP这样说,面试官只有一个字:服!的更多相关文章

  1. 谈谈JAVA工程狮面试中经常遇到的面试题目------什么是MVC设计模式

    作为一名java工程狮,大家肯定经历过很多面试,但每次几乎都会被问到什么是MVC设计模式,你是怎么理解MVC的类似这样的一系列关于MVC的问题. [出现频率] [关键考点] MVC的含义 MVC的结构 ...

  2. 谈谈如何在面试中发掘程序猿的核心竞争力zz

    早两天看了知乎日报的这篇文章<什么是程序员的核心竞争力?>,caoz讲的几点是让我感同身受.这让我联想起了给程序猿的面试,其实也就是通过短暂的接触来发掘程序猿的核心竞争力.接下来我就谈谈我 ...

  3. 面试中的Java链表

    链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...

  4. 阿里 IOS 面试官教你在面试中脱颖而出

    前言: 知己知彼.百战不殆,面试也是如此. 只有充分了解面试官的思路,才能更好地在面试中充分展现自己. 今天,阿里高级技术专家将分享自己作为面试官的心得与体会.如果你是面试者,可以借此为镜,对照发现自 ...

  5. 面试中的MySQL主从复制|手撕MySQL|对线面试官

    关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第三篇文章,今天讲解使用bin log实现主从复制的功能.主从复制也是MySQL集群实现高可用.数据 ...

  6. 杂谈---小故事小道理,面试中的小技巧(NO.2)

    本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...

  7. 2019 中至数据java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中至数据等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中至数据,入职一年时间了,也成为了面 ...

  8. 2019 中手游java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中手游等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中手游,入职一年时间了,也成为了面试官 ...

  9. 2019 中钢网java面试笔试题 (含面试题解析)

      本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中钢网等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中钢网,入职一年时间了,也成为了面试官 ...

随机推荐

  1. rabbitmq 交换机模式一 直连模式 direct

    代码 <?php require_once "./vendor/autoload.php"; use PhpAmqpLib\Connection\AMQPStreamConn ...

  2. 第10天 | 12天搞定Python,文件操作(超详细)

    在开发系统的过程中,经常会用到XML存储和传输数据,XML是一种用于标记电子文件使其具有结构性的标记语言,在博客中经常会见到. JSON是一种轻量级的数据交换格式,常被用在后端和前端的数据交互上,如你 ...

  3. JS时间扩展插件

    前言 原生JS有些没定义的方法只能自己封装了,比如获取现在相隔本年过了几天以及过了多少周,这些都是原JS里没有的方法,现在插件只有一些方法,后期再慢慢扩展 插件使用方法 引用TimeToPack.js ...

  4. deployer服务器端的配置

    虽然说是无侵入的部署工具,但是还是需要我们来做一些微小的配置的,因为出于安全考虑,我们一般不会开发 root 用户的 SSH 登录,而是使用其它用户,比如 Ubuntu 默认的 ubuntu 用户.我 ...

  5. ret2libc--ROP(pwn)漏洞入门分析

    背景知识 fflush 函数,清理缓冲区. fflush(stdout) 一次性输出以上缓冲区所有数据 read(0,&buf,0xAu) 0代表标准输入,标准输出1,标准错误2,&b ...

  6. tf-tensorboard的一些注意事项

    tensorboard --logdir = 绝对路径 1.注意的是绝对路径里面不能有中文 2. tensorboard  文件应放在一个最小子目录中

  7. MAP;MLE

    判别学习算法:直接对问题进行求解,比如二分类问题,都是在空间中寻找一条直线从而把类别的样例分开,对于新的样例只要判断在直线的那一侧就可. ==>这种直接求解的方法称为判别学习方法 生成学习算法: ...

  8. Linux部署常用命令

    1../startup.sh 开启tomcat服务 2.rm -f file1  删除文件 3.rmdir dir xxx 删除目录 4.Tab按钮 自动补全文件名称功能 5.gzip file1  ...

  9. Kubernetes 搭建 ES 集群(存储使用 local pv)

    一.集群规划 由于当前环境中没有分布式存储,所以只能使用本地 PV 的方式来实现数据持久化. ES 集群的 master 节点至少需要三个,防止脑裂. 由于 master 在配置过程中需要保证主机名固 ...

  10. 使用 Filebeat 对多行日志进行处理(multiline)

    Filebeat 收集日志的过程中,默认是按行收取的,也就是每一行都会默认是一个单独的事件并添加时间戳.但是在收集一些特殊日志的时候,往往一个事件包含有多行,例如 Java 的堆栈跟踪日志: 20-0 ...