首先我们要知道AOP是什么?AOP全称Aspect OrientedProgramming,即面向切面编程。在这里我不想去说什么是切面,什么是切点,什么是通知等等,相关博客很多,如果大家想知道可以自己去查,这里我希望用图像加代码方式将这些抽象的概念具体化给读者,给自己也捋一捋思路。


我们结合代码用图像一起说明,先看代码如下:

// 假设我们现在有一个Person类,其中有一个eat的方法
public class Person {
private String name; public Person(String name){
this.name = name
} public void eat() {
System.out.println(name + "正在吃饭........");
}
} // 我们在main函数中调用了这个方法,这也是我们的核心功能
public class Main {
public static void main(String[] args) {
Person person = new Person("zhangsan");
person.eat();
}
}

我相信上面的代码不需要做解释。接下来假设我们要对所有person的eat方法统计耗时,我们的代码可能要变成这样

public class Main {
public static void main(String[] args) {
StopWatch stopWatch = new StopWatch();
Person person = new Person("zhangsan");
stopWatch.start();
person.eat();
stopWatch.stop();
long totalTimeMillis = stopWatch.getTotalTimeMillis();
System.out.println("总耗时"+totalTimeMillis);
}
}

现在我们整个程序可以用下面的图表示:

假设我们现在要为我们为我们程序添加一个sing的方法,也要为这个方法添加耗时统计,这个时候我们的程序变成了下面这个样子

两张图对比我们发现,耗时统计其实是我们系统的一个公用功能,并且不是我们的核心业务,如果我们想对eat方法一样,在方法执行前后执行一次时间采集,无疑是一种很低效的方法,而且代码的复用性也极差

现在我们将耗时统计从我们的系统中抽离出来,用如下的图示意

现在我们的目的是,在程序运行的工程中对eat方法跟sing进行性能监控,我们已经将性能监控的方法从我们系统中抽离出来了,现在要重新嵌进去,并且要适用于两个方法,该怎么做呢?

其实我们要做到的目标可以用下图表示

到这一步我相信大家应该会明白我想表达的意思了,我并不想去深究具体的概念,主要是帮助大家理解

在这个图形中,其实性能监控对应的就是我们的通知(advice),eat方法与sing方法就是我们的切点,红色的我标明的就是切面,这只是个抽象的概念,我这样说也只是为了方便大家理解。其实我自己而言,我更愿意将图中eat方法所代表的直线与红色切面相交的点认作为切点,更多的时候,我更愿意以几何的方式来理解切面,切点的含义,这也是我写这篇文章的原因,有什么不对的希望大家多多指正~~

spring学习笔记(三)我对AOP理解的更多相关文章

  1. spring 学习(三):aop 学习

    spring 学习(三):aop 学习 aop 概念 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 3 aop底层使用动态代 ...

  2. Spring学习笔记(12)——aop

    先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个"时 ...

  3. Spring 学习笔记(六)—— AOP的简单理解

    系统中的业务可以分为核心关注点和横切关注点. 核心关注点时业务处理的主要流程,而横切关注点是与核心业务无关但更为通用的业务. 各个横切关注点离散地穿插于核心业务之中,导致系统地每一个模块都与这些业务具 ...

  4. Spring学习笔记-面向切面(AOP)-04

    什么是面向切面编程 先大概了解一下部分术语 横切关注点:软件开发中,散布于多出的功能称为横切关注点(cross-cutting concern),简单的可以描述为可以影响应用多处的功能,比如日志.安全 ...

  5. Spring学习笔记(三):面向切面的Spring

    Spring之面向切面编程 一.理解何为面向切面编程 对于这个的理解,我觉得Spring实战中的例子讲得很明白: 假设我现在是一个小区用户,每个月小区都要收电费,这时候就会来人查看电表,算出来这个月电 ...

  6. Spring学习笔记--环境搭建和初步理解IOC

    Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...

  7. Spring学习笔记(三)之装配Bean

    除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用 ...

  8. spring学习笔记二 注解及AOP

    本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...

  9. Spring学习笔记5——注解方式AOP

    第一步:注解配置业务类 使用@Component("Pservice")注解ProductService 类 package com.spring.service; import ...

  10. Spring学习笔记(13)——aop原理及拦截器

    原理 AOP(Aspect Oriented Programming),也就是面向方面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP将应用系统分为两部分,核心业务逻辑(Core bu ...

随机推荐

  1. stand up meeting 12/21/2015

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  完成PDF UI主页面的页面切换功能,待完善    4  完善 ...

  2. EOS基础全家桶(八)jungle测试网的使用

    简介 前面我们已经学习了一些EOS的基础知识了,但是在EOS主网上的很多操作(比如:抵押.赎回.买卖内存)都是需要EOS链被正式激活后才可使用,而激活EOS链还需要很多的准备操作,我打算在单独的一篇文 ...

  3. vue2.x学习笔记(十一)

    接着前面的内容:https://www.cnblogs.com/yanggb/p/12586416.html. 表单的输入绑定 表单的输入绑定是一块很重要的内容,因为所有的业务系统都离不开基础表单的录 ...

  4. [YII2] 自带分页调整

    在search Model的search()方法里有一个$dataProvider 属性 ,在这个属性数组里添加 'pagination' => ['pageSize' => 10,],设 ...

  5. java中的模运算规则

    取模运算定义 如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = qd + r 且0 ≤ r < d.其中,q 被称为商,r 被称为余数. 运算实例 java模 ...

  6. Shelve:对象的持久化存储

    目的:Shelve模块为任意能够pickle的Python对象实现持久化存储,并提供一个类似字典的接口. 在关系型数据库还过于复杂的情境中,Shelve为你提供了Python对象持久化的另一种方案. ...

  7. [wp]xctf newscenter

    手工注入 查询所有数据库名称和表名 ' union select 1,table_schema,table_name from information_schema.tables# 发现就两个数据库i ...

  8. python学习笔记(五)---函数与类

    函数 def为定义函数的一个标志 demo1: def greet_user(username): print("Hello, " + username.title() + &qu ...

  9. CentOS 7.4 安装网易云音乐

    1.下包–>网易云音乐 Ubuntu14.04(推荐14.04依赖包网上能找到) 提示:16.04有部分依赖包还找不到,有兴趣可以自行打包RPM安装. 2.解包 (1)使用 ar -vx解压ub ...

  10. Unity 游戏框架搭建 2019 (三十九、四十一) 第四章 简介&方法的结构重复问题&泛型:结构复用利器

    第四章 简介 方法的结构重复问题 我们在上一篇正式整理完毕,从这一篇开始,我们要再次进入学习收集示例阶段了. 那么我们学什么呢?当然是学习设计工具,也就是在上篇中提到的关键知识点.这些关键知识点,大部 ...