首先我们要知道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. IKAnalyzer修改支持lucene8.0

    源码已经上传GitHub. 如果直接使用jar:IKAnalyzer-5.0.2. 在这我只是在原有代码结构上做了微调,让代码支持lucene8.0.

  2. Threejs【坐标转换】如何让annotation跟随物体一起旋转

    现在根据鼠标点击的屏幕位置能够得到屏幕的坐标event.clientX和event.clientY,然后我的annotation就初始化在这个屏幕坐标的位置,那么如何绑定annotation和三维物体 ...

  3. 试验使用t检验

    官方解释 Excel中使用T.TEST函数 T.TEST(array1,array2,tails,type) Array1      必需.第一个数据集. Array2      必需.第二个数据集. ...

  4. stand up meeting 1/19/2016

    part 组员                工作              工作耗时/h 明日计划 工作耗时/h    UI 冯晓云  准备最后的发布和整个开发的整理总结    6 继续releas ...

  5. windows编译动态链接库,dll+lib的形式

    之前一直在linux上做开发,没怎么关注过windows上如何编译动态链接库.不过一直存疑,为什么windows上的动态链接库是.dll配合.lib使用的,这个又是怎么生成的呢,通过一段时间的查资料和 ...

  6. ADO.Net和Entity Framework的区别联系

    它们有以下几点区别:1,ADO.Net是开发人员自己select.update等写sql语句,来实现对数据库的增删改查等操作:采用EF进行开发操作数据库的时候,只需要操作对象,这样做使开发更方便,此时 ...

  7. python-Django收集主机信息json格式

    Control: from django.conf.urls import patterns, include, url from django.contrib import admin admin. ...

  8. python os模块判断文件是否存在

    import os os.path.exists(test_file.txt)

  9. Mac安装aws-cli全过程,通过命令行上传文件到aws s3协议服务器

    第一次使用aws,首先查询了各种资料,我第一步需要做的是安装aws-cli,而安装aws-cli之前需要安装python3,当然你安装python3之前你还需要安装homebrew,当然我正在安装的过 ...

  10. PHP生成桌面快捷方式,保存一个网页至桌面上成为快捷方式

    header("Content-Type: application/octet-stream; charset=utf8"); header("Content-Dispo ...