师爷,翻译翻译什么叫AOP

这篇具有很好参考价值的文章主要介绍了师爷,翻译翻译什么叫AOP。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

张麻子:汤师爷,翻译翻译,什么叫AOP?

汤师爷:这还用翻译。

张麻子:我让你翻译给我听,什么叫AOP?

汤师爷:不用翻译,切面编程就是AOP啊。

黄四郎:难道你听不懂什么叫AOP?

张麻子:我就想让你翻译翻译,什么叫AOP!

汤师爷:AOP嘛。

张麻子:翻译出来给我听,什么他妈的叫AOP!什么他妈的叫他妈的AOP!

汤师爷:什么他妈的叫AOP啊?

黄四郎:AOP就是Aspect Oriented Programming,面向切面编程!明白了吗?

汤师爷:这就是AOP啊。

张麻子:翻译翻译。

汤师爷:...

汤师爷:AOP就是Aspect Oriented Programming!面向切面编程!面向!切面!横着切!切面!

张麻子:哈,大哥这是他妈的AOP啊,小弟我马上给个三连。

下面我们好好翻译一下AOP切面编程。

老规矩,在学习切面面编程之前要有前置知识:

终于搞懂动态代理了!

目标

• 动态代理搞明白,AOP就明白了

• 学会在开发中使用Spring的AOP技术

概念

AOP 是 Aspect Oriented Programming,和OOP(Object Oriented Programming)一词之差,OOP强调万物皆是对象,那AOP呢?

要真正理解 AOP 就要理解 AOP 的核心:Aspect

WTF is Aspect?

我们把aspect翻译成切面,但是切面这个词对应中文语义其实很难理解到位。

我们换种解释,aspect我们理解为事物的某个方面、某个视角

与面向对象思想相对,对象强调一个整体,一个人站在你面前,我们称之为对象。

而aspect强调功能化、模块化、关注点分离

天气变冷了,人要多穿衣服,上帝控制这么多人的对象,总不能一件一件穿吧?

所以AOP思想就是把天气变冷穿衣服这件事抽离出来,模块化,单独进行关注,然后经过编码实现后,上帝就可以进行一键穿衣,节省了大量工作。

放在实际开发中,我们以最常见的日志打印为例。

我们系统中有200个Controller,都要打印请求日志,那没有AOP思想的实践的话,我们只能一个一个在Controller里编写一遍又一遍的重复代码,有了AOP思想,就可以考虑把日志打印这件事抽离出来做成单独的业务,实现一劳永逸。

那怎么实现呢?

那就要靠我们的动态代理了。

什么?你还没看动态代理?

上帝在吗?把这个人的棉衣扒了。

Spring实现AOP

我们知道框架的存在意义是用来简化开发的。

这里Spring简化了什么呢?

自然是我们在动态代理部分编写的一大堆要么看不懂,看懂了又不想写的代码。

AOP作为Spring的左膀右臂之一,自然对这部分加以简化。

但Spring那一大堆xml也是够够的。

所以SpringBoot才是我们永远的家。

废话不多说直接上代码示例,在AOP代码的编写中提出问题,解决问题,那么最后就算是学会了。

引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--aop-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

编写代码

编写这部分代码的逻辑也是非常符合我们的认知逻辑的。

我们前边已经说清楚AOP是做什么的了。

那我们编写代码就要做3件事:

  • • 抽离出功能模块——定义切面

  • • 确认功能代码加在哪——定义切点

  • • 确认功能代码什么时候执行——选择通知类型

我们先把controller给出来:

@RestController
public class AopController {

    @RequestMapping("/hello")
    public String sayHello(){
        System.out.println("hello");
        return "hello";
    }
}

定义一个切面

也就是抽离出功能模块

先随便写个类。

然后就直接一个@Aspect就行了,那这个类就是一个切面类。

还要再加一个@Component将该类纳入Ioc容器。

就这么简单,狗来了都会写。

@Aspect
@Component
public class AopAdvice {
}

定义一个切点

也就是确认功能代码加在哪

先随便写一个方法。

然后就直接一个@Pointcut就行了,那这个方法就是一个切点。

还要再加上表达式,让系统知道代码加到什么位置。

@Aspect
@Component
public class AopAdvice {

    @Pointcut("execution (* com.example.aop.controller.*.*(..))")
    public void test() {
    }
}

这时候有同学问:

啊这个execution是什么?

里面那又是一坨什么?

根本看不懂。

举报了。

这个我只能说,这是固定的表达式,是规定。

规定什么?

看规定之前先记住:表达式一定从右往左匹配。

看规定之前先记住:表达式一定从右往左匹配。

看规定之前先记住:表达式一定从右往左匹配。

execution(访问修饰符(可省略) 方法返回值 包名.类名.方法名(参数))
参数:..代表任何参数
方法: *代表任何方法
类名: *代表所有类
包名: *代表所有包 ..代表子孙包
返回值: *代表所有类型返回值

具体的写法实际五花八门,而且除了execution还有一大堆,为了不让大脑过度疲劳,我们一次只有一个目标:

会用,但不精通。

选择通知类型

也就是确认功能代码什么时候执行

下面就是通知类型5种,前3种比较常用:

前置通知(@Before):在目标方法调用之前调用通知

后置通知(@After):在目标方法完成之后调用通知

环绕通知(@Around):在被通知的方法调用之前和调用之后执行自定义的方法

返回通知(@AfterReturning):在目标方法成功执行之后调用通知

异常通知(@AfterThrowing):在目标方法抛出异常之后调用通知

代码如下:

@Aspect
@Component
public class AopAdvice {

    @Pointcut("execution (* com.example.aop.controller.*.*(..))")
    public void test() {

    }

    @Before("test()")
    public void beforeAdvice() {
        System.out.println("beforeAdvice...");
    }

    @After("test()")
    public void afterAdvice() {
        System.out.println("afterAdvice...");
    }

    @Around("test()")
    public void aroundAdvice(ProceedingJoinPoint joinPoint) {
        System.out.println("before");
        try {
            joinPoint.proceed();
        } catch (Throwable t) {
            t.printStackTrace();
        }
        System.out.println("after");
    }
}

从以上代码中可以看出,@Before和@After都已经简单到不能再简单了。

我们需要说一下这个@Around 环绕通知

joinPoint.proceed()这行代码我们就理解为我们需要增强的那个方法的替身就行了。

这也不是想说的,这里我们主要讲一下 ProceedingJoinPoint joinPoint 这个参数。

ProceedingJoinPoint 是一个接口,也就是说这里实际是使用了多态,这不重要。

ProceedingJoinPoint 继承了 JoinPoint 这个接口。

这个JoinPoint有2个方法是我们需要说的。

Object getTarget();
Signature getSignature();

getTarget() 方法返回的是目标对象,即那个被增强方法所属的对象实例。

getSignature() 方法返回的是连接点的签名,即关于被调用的方法(或访问的字段等)的静态信息,如方法名、返回类型、参数类型等。

那么通过这2个方法,就能获取到所有的对象信息和方法信息,那么能做的事就太多了。

但是我们这里不展示更复杂的案例。

依然坚持我们本篇的策略:

懂点,但不多。

会用,但不精。

测试

启动项目,浏览器访问:

http://localhost:8080/hello

运行结果:

before
beforeAdvice...
hello
afterAdvice...
after

往期推荐:

● 0.o?让我看看怎么个事儿之SpringBoot自动配置

● 终于搞懂动态代理了!

● 学会@ConfigurationProperties月薪过三千

● 学一点关于JVM类加载的知识

● Java注解,看完就会用

● Java反射,看完就会用文章来源地址https://www.toymoban.com/news/detail-801307.html

到了这里,关于师爷,翻译翻译什么叫AOP的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 什么是AOP?

    目录 一、AOP简介 1、AOP简介和作用 2、AOP的概念 二、AOP的基本实现  三、AOP工作流程 1 、AOP工作流程 2、AOP核心概念 四、AOP切入点表达式 1、语法格式 2、通配符 五、AOP通知类型 1、AOP通知分类 2、AOP通知详解 (1)前置通知 (2)后置通知 (3)环绕通知(重点) (4)返回后

    2024年02月11日
    浏览(14)
  • 【JavaEE】面向切面编程AOP是什么-Spring AOP框架的基本使用

    【JavaEE】 AOP(1) 1.1 AOP 与 Spring AOP AOP ( A spect O riented P rogramming),是一种思想,即 面向切面编程 Spring AOP 则是一个框架,Spring项目中需要引入依赖而使用 AOP和Spring AOP的关系就相当于IoC和DI Spring AOP让开发者能够半自动的开发AOP思想下实现的功能 1.2 没有AOP的世界是怎样的

    2024年02月11日
    浏览(46)
  • 什么是可以文言文字翻译的呢?

    大家有没有在日常生活中需要翻译自己不熟的外语呢?有没有觉得使用翻译软件的时候很轻松呢?你们知道文本翻译这个操作吗?它是一项很实用和创新的技术,可以将一种语言自动翻译转换为另一种语言,当然这些一般都是使用计算机程序或人工翻译来完成,它会采用自然

    2024年02月08日
    浏览(30)
  • 什么是自然语言处理的机器翻译?

    机器翻译(Machine Translation,MT)是一种自然语言处理技术,旨在将一种语言的文本自动翻译成另一种语言。机器翻译是自然语言处理领域的重要应用之一,它可以帮助人们在跨语言交流、文档翻译和信息检索等方面更加便捷和高效。本文将详细介绍自然语言处理的机器翻译。

    2024年02月05日
    浏览(41)
  • 为什么需要多语言并行机器翻译?

    随着全球化的加速和不同语言之间的交流需求不断增长,多语言机器翻译(Multilingual Parallel Machine Translation)成为一个备受关注的领域。传统上,机器翻译系统主要集中于一对特定语言之间的翻译,但这种单一语言对的模式在面对多语言环境时存在一些挑战。因此,多语言并

    2024年02月12日
    浏览(50)
  • 114、Spring AOP是如何实现的?它和AspectJ有什么区别?

    其实,AOP只是一种编程思想,表示面向切面编程,如果想实现这种思想,可以使用动态代理啊,第三方的框架 AspectJ啊等等。 Spring AOP是利用的动态代理机制 如果一个Bean实现了接口,那么就会采用JDK动态代理来生成该接口的代理对象 如果一个Bean没有实现接口,那么就会采用

    2024年02月14日
    浏览(41)
  • Spring 为什么要用三级缓存来解决循环依赖(AOP),二级缓存不行吗

    解决有代理对象的循环依赖不一定要三级缓存,用二级甚至一级也能解决,下面讨论下Spring为什么选择三级缓存这个方案。 Spring最开始是没有三级缓存的,后面版本因为引入了AOP,有了代理对象,又因为存在循环依赖,为了保证依赖注入过程注入的是代理对象,且不完全打破

    2024年04月26日
    浏览(39)
  • Spring AOP(AOP概念、组成、Spring AOP实现及实现原理)

    学习 Spring AOP 之前,先要了解 AOP 是什么 AOP(Aspect Oriented Programming):面向切面编程,它和 OOP(面向对象编程)类似。 它是一种思想, 是对某一类事情的集中处理。 比如用户登录权限的效验,在学习 AOP 之前,在需要判断用户登录的页面,都要各自实现或调用用户验证的方

    2024年02月02日
    浏览(40)
  • Spring | Srping AOP (AOP简介、动态代理、基于“代理类”的AOP实现)

    作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习! 该文章 参考学习教材 为: 《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著 文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和

    2024年01月22日
    浏览(38)
  • Spring AOP(AOP概念,组成成分,实现,原理)

    目录 1. 什么是Spring AOP? 2. 为什么要用AOP? 3. AOP该怎么学习? 3.1 AOP的组成 (1)切面(Aspect) (2)连接点(join point) (3)切点(Pointcut) (4)通知(Advice)  4. Spring AOP实现 4.1 添加 AOP 框架支持 ​编辑  4.2 定义切面 4.3 定义切点 4.4 定义通知 4.5 切点表达式说明 AspectJ

    2024年02月13日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包