spring学习笔记(三)我对AOP理解
首先我们要知道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理解的更多相关文章
- spring 学习(三):aop 学习
spring 学习(三):aop 学习 aop 概念 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 3 aop底层使用动态代 ...
- Spring学习笔记(12)——aop
先了解AOP的相关术语:1.通知(Advice):通知定义了切面是什么以及何时使用.描述了切面要完成的工作和何时需要执行这个工作.2.连接点(Joinpoint):程序能够应用通知的一个"时 ...
- Spring 学习笔记(六)—— AOP的简单理解
系统中的业务可以分为核心关注点和横切关注点. 核心关注点时业务处理的主要流程,而横切关注点是与核心业务无关但更为通用的业务. 各个横切关注点离散地穿插于核心业务之中,导致系统地每一个模块都与这些业务具 ...
- Spring学习笔记-面向切面(AOP)-04
什么是面向切面编程 先大概了解一下部分术语 横切关注点:软件开发中,散布于多出的功能称为横切关注点(cross-cutting concern),简单的可以描述为可以影响应用多处的功能,比如日志.安全 ...
- Spring学习笔记(三):面向切面的Spring
Spring之面向切面编程 一.理解何为面向切面编程 对于这个的理解,我觉得Spring实战中的例子讲得很明白: 假设我现在是一个小区用户,每个月小区都要收电费,这时候就会来人查看电表,算出来这个月电 ...
- Spring学习笔记--环境搭建和初步理解IOC
Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...
- Spring学习笔记(三)之装配Bean
除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用 ...
- spring学习笔记二 注解及AOP
本节需要导入spring-aop包 注解 使用注解的目的是为了代替配置,在使用注解时,省略键时,则是为value赋值. 扫描某个包下的所有类中的注解 <?xml version="1. ...
- Spring学习笔记5——注解方式AOP
第一步:注解配置业务类 使用@Component("Pservice")注解ProductService 类 package com.spring.service; import ...
- Spring学习笔记(13)——aop原理及拦截器
原理 AOP(Aspect Oriented Programming),也就是面向方面编程的技术.AOP基于IoC基础,是对OOP的有益补充. AOP将应用系统分为两部分,核心业务逻辑(Core bu ...
随机推荐
- AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI
AJ分享,必须精品 先看效果图 编程思路 代码创建Cell的步骤 1> 创建自定义Cell,继承自UITableViewCell 2> 根据需求,确定控件,并定义属性 3> 用get ...
- vuepress+gitee 构建在线项目文档
目录 快速入门 在现有vue项目中安装本地开发依赖vuepress 在现有vue项目根目录下创建docs目录 创建并配置文档首页内容 运行,查看效果 可能会出现vue和vue-server-rende ...
- MySQL 5.7.18 zip 文件安装过程
安装最新MySQL:5.7.18 1.下载路径 https://dev.mysql.com/downloads/mysql/ 有账号登陆下载, 没有账号:no thanks;just start my ...
- day28作业
import os import uuid import pickle from conf import settings class School: def __init__(self,name,a ...
- Daily Scrum 1/6/2015
Process: Zhaoyang: Complete the speech API test and do some UI upgrade. Yandong: Help zhaoyang to do ...
- G - Number Transformation BFS
In this problem, you are given an integer number s. You can transform any integer number A to anothe ...
- A - Engines Atcoder 4900
题目大意:n个点,任意几个点组合后得到的点距离原点的最远距离. 题解:极角排序:https://blog.csdn.net/qq_39942341/article/details/79840394 利 ...
- F. Count Prime Pairs
单点时限: 2.0 sec 内存限制: 512 MB 对于数组a,如果i≠j并且ai+aj是一个质数,那么我们就称(i,j)为质数对,计算数组中质数对的个数. 输入格式 第一行输入一个n,表示数组的长 ...
- Python实现按键精灵(一)-键鼠操作
需要安装 pywin32库 pip install pywin32 import win32api import time #鼠标移动 def mouse_move(x,y): win32api.Se ...
- CSRF(跨站请求伪造)学习总结
前言 参考大佬的文章,附上地址 https://www.freebuf.com/articles/web/118352.html 什么是CSRF? CSRF,中文名字,跨站请求伪造,听起来是不是和XS ...