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

前面几天介绍了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这样说,面试官只有一个字:服!的更多相关文章
- 谈谈JAVA工程狮面试中经常遇到的面试题目------什么是MVC设计模式
作为一名java工程狮,大家肯定经历过很多面试,但每次几乎都会被问到什么是MVC设计模式,你是怎么理解MVC的类似这样的一系列关于MVC的问题. [出现频率] [关键考点] MVC的含义 MVC的结构 ...
- 谈谈如何在面试中发掘程序猿的核心竞争力zz
早两天看了知乎日报的这篇文章<什么是程序员的核心竞争力?>,caoz讲的几点是让我感同身受.这让我联想起了给程序猿的面试,其实也就是通过短暂的接触来发掘程序猿的核心竞争力.接下来我就谈谈我 ...
- 面试中的Java链表
链表作为常考的面试题,并且本身比较灵活,对指针的应用较多.本文对常见的链表面试题Java实现做了整理. 链表节点定义如下: static class Node { int num; Node next ...
- 阿里 IOS 面试官教你在面试中脱颖而出
前言: 知己知彼.百战不殆,面试也是如此. 只有充分了解面试官的思路,才能更好地在面试中充分展现自己. 今天,阿里高级技术专家将分享自己作为面试官的心得与体会.如果你是面试者,可以借此为镜,对照发现自 ...
- 面试中的MySQL主从复制|手撕MySQL|对线面试官
关注微信公众号[程序员白泽],进入白泽的知识分享星球 前言 作为<手撕MySQL>系列的第三篇文章,今天讲解使用bin log实现主从复制的功能.主从复制也是MySQL集群实现高可用.数据 ...
- 杂谈---小故事小道理,面试中的小技巧(NO.2)
本篇是接着上一篇面试随笔的,上一次有猿友反应写的有些“扯淡”,LZ思来想去最大的原因可能是由于上一章写的全是一些大忌,既然是大忌,那么在现实当中发生的概率还是相对较小的,大部分人还是很少在面试中犯如此 ...
- 2019 中至数据java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中至数据等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中至数据,入职一年时间了,也成为了面 ...
- 2019 中手游java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中手游等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中手游,入职一年时间了,也成为了面试官 ...
- 2019 中钢网java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.中钢网等公司offer,岗位是Java后端开发,因为发展原因最终选择去了中钢网,入职一年时间了,也成为了面试官 ...
随机推荐
- spring boot:redis+lua实现顺序自增的唯一id发号器(spring boot 2.3.1)
一,为什么需要生成唯一id(发号器)? 1,在分布式和微服务系统中, 生成唯一id相对困难, 常用的方式: uuid不具备可读性,作为主键存储时性能也不够好, mysql的主键,在分库时使用不够方便, ...
- buuctf-misc-刷新过的图片
知识点:F5隐写 kali中安装F5-steganography 工具 git clone https://github.com/matthewgao/F5-steganography 解密的时候输入 ...
- sql中的Bulk 导入txt文本
通常,我们会对于一个文本文件数据导入到数据库中,不多说,上代码. 首先,表结构如下. 其次,在我当前D盘中有个文本文件名为2.txt的文件. 在数据库中,可以这样通过一句代码插入. Bulk in ...
- 选择SaaS平台的那些事
将近一年多没有更新博客和自己的订阅号.除了本身有点懒之外,也有幸在上半年花了一些时间考出了CISSP.最近也在研究云平台相关的一些课题. 写这篇文章本身是因为在工作中经常有IT乃至业务的同事会问及企业 ...
- C# 面试前的准备_基础知识点的回顾_02
1.数据库的范式 这算入门问题了吧,但凡是个数据库类的,都得问吧, 但我们在回答的时候开始背书啦 第一范式(1NF)无重复的列 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ] 第三范 ...
- 安装Linux注意事项
网络配置NAT Worstation 生成虚拟网卡,编辑虚拟网络中子网IP地址为10网段内部地址,避免冲突. Linux命令 查看主机IP地址 [root@C8 ~]# hostname -I 19 ...
- py中变量名的“秘密”
今天突然脑子发抽,想到py里有没有指针这个概念,于是我马上google.baidu了一波,发现网上大多都在说py.java.c#这类纯面向对象的编程语言用对象的概念能完全替代指针.那么问题来了,没有指 ...
- Windows搭建Hexo系统
date: 2018-11-16 17:10:51 updated: 2018-11-16 20:04:43 1.安装Git 下载Windows下的Git客户端并安装,安装很简单,基本一路Next下去 ...
- Docker composer搭建Spring Cloud Alibaba 运行环境(二)
" Spring Cloud Alibaba要用到的组件很多,注册中心nacos, 限流sentinel, 数据库,网关等等.由于用到的组件相对较多,部署会很繁琐,最关键的是没有资源服务器, ...
- SharedPreferences源码分析
分析达成目标 了解基本实现 SharePreferences是否线程安全 SharePreferences的mode参数是什么 了解apply与commit的区别 导致ANR的原因 Android8. ...