网易首页 > 网易号 > 正文 申请入驻

Java程序员应知应会之Spring AOP详解

0
分享至

大部分Java程序员都很了解Spring的IOC和AOP,但是对其内涵却缺乏系统性的了解。今天我们就一起来学习一下AOP。

AOP即面向切面编程,其通过预编译方式和运行期动态代理实现程序功能的统一维护。它是对于传统面向对象编程(OOP)的补充,目前已经发展成为了一种较为成熟的编程技术。下面我们就来详细了解一下AOP的概念和特点。

一、AOP的缘起

对于OOP来说,按照业务对象对系统进行抽象和定义,是大家非常熟悉的一种编程方式。但是对于事务控制、权限控制、日志控制等一些非业务逻辑的控制,如果将它们分散到各个业务模块中进行定义,那么当某个业务模块关闭或者需要修改的时候,势必会对非业务逻辑 控制的代码产生影响。这样的话,不仅增加了程序开发人员的工作量,还有可能引入新的Bug。

因此,AOP为此问题提供了解决方案,在不影响原来功能的代码的基础上,采用横向抽取的方式,将分散在各个业务模块中实现非业务操作(如权限验证、事务控制、日志记录)的重复代码提取出来,定义为一些独立的个体。在程序编译或者运行时,通过动态代理的方式将这些非业务操作的独立个体加入到主业务流程中。这样的话,即使以后根据需要移除这些非业务操作,也不会影响主业务流程。

二、什么是Spring AOP

AOP的主要编程对向是切面。要想理解切面的概念,就要先理解什么是面。从日常生活中来看,常常听说“以点带面”这句话,点表示个体,面表示群体。也就是说,一个群体都要做的事情,就是“面”。例如,大家都要进一道门,门上设置了指纹锁,大家都要开锁才能进门,那么“刷指纹进门”这个动作就是一个涉及“面”的动作。那么,如何将这个概念抽象到编程里来呢?

现在的软件开发多采用基于OOP的分层机制,如最常用的MVC,就分为业务实体层、业务逻辑层、控制层、表示层等。项目的每个层是一个对象或多个对象。例如一个学生管理系统,可能分为成绩管理、学生管理、用户管理等模块。那么如果这些模块都需要记录日志,应该怎么办呢?

如果按照OOP的思路,那么就需要先建立一个日志类,类中提供记录日志的方法。然后在控制层或业务逻辑层进行调用。但是这样的话,会存在一些问题,如日志记录与主业务流程有没有关系,而且按照这种方式会产生大量重复的代码,难以修改和维护。那么解决方案就是统一处理,横切一刀。在控制层和业务逻辑层间横切一刀,切出一个面。通过切面在各个模块的方法中加入日志记录功能,从而实现日志记录的统一处理。这就是AOP的应用,AOP是OOP的补充,可以实现对目标程序功能的增强。同时,使用AOP可以使开发人员在编写业务逻辑时能够专注于核心业务,而不用过多的关心其它非业务逻辑功能的实现。

三、AOP的常用术语

在AOP中,除了切面以外,还有一些专用的术语。包括:

1、切面(Aspect):切面=处理+切入点,通常指封装后的用户横向切入主业务流程中的非业务逻辑实现类,如事务管理、日志记录等。

2、处理(Advice):即增强处理,具体指在定义好的切入点处要执行的增强处理代码,如执行日志记录操作的代码。

3、切入点(Pointcut):指切面与目标业务程序的交叉点,一般切入点指得是类或方法。如果某个处理要应用于所有以delete开头的方法,则所有满足这一规则的方法都是切入点。

4、目标对象(Target):处理被应用的对象。

5、织入(Weaving):指有了切面和待切入的目标对象的切入点以后,通过生成代理对象的方式将切面代码插入目标的过程。

6、代理对象(Proxy):指将处理应用到目标对象后,被动态创建的对象。代理指为别人的业务提供增值服务。

四、AOP的处理类型

AOP的处理类型有:

1、前置处理:Before

2、环绕处理:Around

3、后置处理:After

4、后置返回处理:AfterReturning

5、后置异常处理:AfterThrowing

其执行顺序为:

1、环绕处理执行开始

2、前置处理执行开始

3、前置处理执行完毕

4、进入目标方法

5、环绕处理执行完毕

6、后置处理执行开始

7、后置处理执行完毕

8、后置返回处理执行开始

9、后置返回处理执行完毕

其架构如图所示:

五、AOP的实现

我们下面以一个例子来看AOP是如何实现的。比如我们要实现“所有的get请求在被调动前打印出一句话”。

那么我们首先要确定一个Pointcut,即切入点,所有的get请求,这个切入点可以通过Spring的GetMapping这个注解来找到。

那么我们先实现一个AOP切面类,实现起来很简单,只需要加个@Aspect注解即可,通常还要与@Component一起使用,表示这个类将由Spring来管理。我们将在这个类里实现Advice。

代码如下:

package com.jingudi.framework.log.log.aspect;

import org.aspectj.lang.annotation.Aspect;

import org.aspectj.lang.annotation.Before;

import org.aspectj.lang.annotation.Pointcut;

import org.springframework.stereotype.Component;

@Aspect

@Component

public class LogAdvice {

// 定义一个切点:所有被GetMapping注解修饰的方法会织入advice

@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")

private void logAdvicePointcut(){}

@Before("logAdvicePointcut()")

public void logAdvice(){

// 这里只是一个示例,你可以写任何处理逻辑

System.out.println("get请求的advice触发了");

然后我们随便创建一个带@GetMapping注解的接口,就可以了。代码如下:

@ApiOperation("查询用户列表")

@GetMapping

public PageResult

getUserList(QueryUserVo vo) {

return userService.getUserList(vo);

执行效果如下:

这是一个很简单的例子,我们应用了Spring里面的GetMapping注解来寻找切入点。通常在实际应用中,我们可以自定义一个注解,然后利用这个注解来注释需要切入的地方。就可以了。而且在自定义注解中还可以定义一些变量,从而实现更多的功能。

以上就是AOP的基本概念,觉得有用的话,欢迎关注活在信息时代公众号哦。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
明日国庆节,提醒“5样不上桌,福气不进门”,5样指啥?传统莫忘

明日国庆节,提醒“5样不上桌,福气不进门”,5样指啥?传统莫忘

小茉莉美食记
2024-09-30 06:40:30
大号水蜜桃师娘运动风穿搭,上紧下松,舒适恬淡

大号水蜜桃师娘运动风穿搭,上紧下松,舒适恬淡

云端小院
2024-08-30 09:03:30
真主党副领导人满头冷汗地表示:已做好应对以色列的地面行动

真主党副领导人满头冷汗地表示:已做好应对以色列的地面行动

桂系007
2024-09-30 21:51:03
名场面!梅西“助攻”冲场小球迷视频在国外疯狂,球迷:举世无双

名场面!梅西“助攻”冲场小球迷视频在国外疯狂,球迷:举世无双

侧身凌空斩
2024-09-30 10:18:27
美媒爆料:以特种部队近几天在黎巴嫩开展小规模突击行动,为可能的地面进攻做准备

美媒爆料:以特种部队近几天在黎巴嫩开展小规模突击行动,为可能的地面进攻做准备

环球网资讯
2024-09-30 22:22:27
与县委书记存在不正当性关系的李佩霞被双开,老爹欲哭无泪

与县委书记存在不正当性关系的李佩霞被双开,老爹欲哭无泪

奶油芒
2024-08-22 15:10:02
上海松江警方:一男子超市内持刀伤人被当场抓获,3人抢救无效死亡

上海松江警方:一男子超市内持刀伤人被当场抓获,3人抢救无效死亡

澎湃新闻
2024-10-01 01:26:28
阿娇的“大腿”,撕碎了多少女明星的“虚伪”面具

阿娇的“大腿”,撕碎了多少女明星的“虚伪”面具

八卦南风
2024-09-29 17:35:33
恨国党篡改过的这条新闻,骗了我们整整10年

恨国党篡改过的这条新闻,骗了我们整整10年

笑熬浆糊111
2024-09-22 00:15:02
乒乓大满贯赛:法国大勒布伦0-3惨败一轮游,巴西雨果大获全胜

乒乓大满贯赛:法国大勒布伦0-3惨败一轮游,巴西雨果大获全胜

全言作品
2024-09-30 19:09:30
注意了!紧急突发,A股将有大动作,下周会这样走

注意了!紧急突发,A股将有大动作,下周会这样走

夏日的甜蜜回忆
2024-09-30 11:58:22
许勇同志逝世

许勇同志逝世

新京报政事儿
2024-09-30 20:22:31
心酸!男子离异后凌晨4点还在外喝酒,3岁女儿乖坐一旁熬夜等爸爸

心酸!男子离异后凌晨4点还在外喝酒,3岁女儿乖坐一旁熬夜等爸爸

有趣的火烈鸟
2024-09-06 23:56:10
马斯克吐槽:看看中国的登月服,再看看美国......

马斯克吐槽:看看中国的登月服,再看看美国......

环球时报新闻
2024-09-29 22:51:49
江苏一女子用“硫磺皂”洗头,坚持半年后,头发发生了4大变化!

江苏一女子用“硫磺皂”洗头,坚持半年后,头发发生了4大变化!

今日养生之道
2024-09-28 16:57:38
比美国还狂妄,这国总统点名中国,要求就导弹试射作出解释!

比美国还狂妄,这国总统点名中国,要求就导弹试射作出解释!

日风的故事屋
2024-09-29 20:49:51
超级冷门!中国黑马横扫4号种子,创伟大纪录,半决赛挑战世界第1

超级冷门!中国黑马横扫4号种子,创伟大纪录,半决赛挑战世界第1

室内设计师阿喇
2024-09-30 22:38:11
43岁全智贤穿瑜伽裤,阳光紧致饱满,成熟韵味十分迷人

43岁全智贤穿瑜伽裤,阳光紧致饱满,成熟韵味十分迷人

曼巴影娱
2024-09-02 17:06:19
光速复出!皇马官方公布欧冠名单:5天前受伤的姆巴佩名列其中

光速复出!皇马官方公布欧冠名单:5天前受伤的姆巴佩名列其中

直播吧
2024-09-30 20:55:16
穆里尼奥成为首位,现场挑战Var的教练,引发足球规则改革的热议

穆里尼奥成为首位,现场挑战Var的教练,引发足球规则改革的热议

室内设计师阿喇
2024-09-30 17:50:47
2024-10-01 02:12:49
活在信息时代
活在信息时代
信息时代的技术与社会伦理
748文章数 793关注度
往期回顾 全部

科技要闻

最赚的AI公司钱也不够花 OpenAI决心"营利"

头条要闻

NBA名宿穆托姆博因脑癌去世 终年58岁

头条要闻

NBA名宿穆托姆博因脑癌去世 终年58岁

体育要闻

曼联0-3热刺:这个滕,可能真要保不住了

娱乐要闻

王楚然,悄无声息中成了年度大赢家

财经要闻

暴涨天量!A股领涨全球 你回本了吗?

汽车要闻

拒绝平庸 深蓝S05是台更有范儿的家用SUV

态度原创

艺术
本地
手机
房产
家居

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

本地新闻

云游中国|还有谁不知道 荆门人有属于自己的仙本那

手机要闻

快于友商!vivo X200系列突然官宣,关键配置基本没悬念了

房产要闻

国庆到啦!快来查收你的买楼大礼包

家居要闻

琴瑟和鸣 中式庭院风

无障碍浏览 进入关怀版