大白话AOP
工作一年多后, 第二次看了韩顺平老师讲的AOP (11年的Spring 教学视频)
AOP还是比较艰涩的东西. 从刚开始 碰Java项目去找书看开始, 到学了拦截器知道AOP就是处理事务, 日志, 安全等东西的机制,但对那些名词还是不懂.
目录:
1. 从消除重复代码讲起.
1.5 到专注业务
2. 图解AOP
2.5不用AOP也能有设计模式来搞定
3. 说人话的概念
1. Spring 官方文档介绍AOP是以"让我们了解AOP的一些核心概念"开始的, 一上来就糊你一脸概念: 什么切面(aspect), 动态代理(dynamic proxy), 连接点, 切入点, 目标对象(target)
小白就是这么被吓跑的(笑), 说的就是我.
从简单的, 亲和力更好的角度(方面?)入手, 让我们从"重复代码"的角度来介绍AOP.
在备受推崇的<重构:改善既有代码的设计> 和 <代码整洁之道> 两本书中, 重复代码duplicate code是一种罪恶. "没有重复代码"的重要程度仅次于"通过所有测试".
(注: 评价clean code 的标准 1. 通过所有测试 2.没有重复代码 3. 体现系统中的全部设计理念 4. 包括尽量少的实体(类,方法,函数))
没错, AOP是一种消除重复代码的手段.
举个栗子: A service 需要事务, B service 也需要打开事务.
Class ServiceA {
void methodA() {
// 打开事务
// 干活儿
// 提交事务
}
}
同样的代码在ServiceB也有.
这就有bad smell了, 两个方法体分别是XAY和XBY,显然,这出现了重复,违反了DRY原则(dont repeat yourself)。
Here comes AOP.
1. AOP 把事务这种"重复代码" 从ServiceA, ServiceB抽出来, 把重复代码只放在一个地方(另一个类中).
2. AOP 再把抽出来的东西放回去
通过这样一波操作, 重复代码(可以使打日志, 开关事务, 鉴权等)已经背分离出来, 并且没有重复了.
1.5 何来专注业务一说?
琐碎的非业务代码: 记日志, 鉴权, 事务等操作都和业务代码没直接关系, 通过抽取(Extraction)的方式, 从业务代码分离, 进而分离了业务的复杂度.
原来的代码变成
void methodA() {
// 打开事务
// 干活儿
// 提交事务
}
只有一行业务代码, 更方便阅读
2. 图解AOP
从消除重复代码的角度, 我们可以对AOP有一个感性的认识. 然后看图学一下AOP的原理。

2.5 不用AOP也能有设计模式来搞定
只是利用抽出非业务代码来分离复杂度的话, 其实就设计模式在搞这个的
模板方法模式
甚至直接抽方法 把非业务代码独立成一个方法都能取得同样的效果。
不一定要AOP来实现。
3.说人话的概念
最后讲AOP中概念
切面: Aspect: 日志, 事务, 鉴权
目标对象:target:放着业务代码
代理对象: 对target的动态代理
通知:Advice: 非业务代码, 用来织入到业务代码中
织入: weave 把通知(advice)放到代理对象中的连接点
连接点 Joint point: 可以插入通知代码的位置
插入点 Pointcut: 没插入时叫连接点, 插入后就叫插入点
插入点和连接点只是看问题的角度不同
大白话AOP的更多相关文章
- 对 Spring 的核心(AOP 和 IOC)的理解(大白话)
Spring 首先它是一个开源而轻量级的框架.其核心容器的主要组件是Bean工厂(BeanFactory).Bean工厂使用控制反转(IOC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AO ...
- 大白话讲解IOC和AOP
IOC和AOP 什么是IOC IoC(Inversion of control)控制反转,它是一种思想,而Spring Framework实现了这一思想.Ioc也称为依赖注入(DI). IOC控制反转 ...
- 注解:大话AOP与Android的爱恨情仇
转载:大话AOP与Android的爱恨情仇 1. AOP与OOP的区别 平时我接触多的就是OOP(Object Oriented Programming面向对象).AOP(Aspect Oriente ...
- (五)Spring 中的 aop
目录 文章目录 AOP概念 AOP原理 AOP术语 **`Spring`** 中的 **`aop`** 的操作 使用 `AspectJ` 实现 `aop` 的两种方式 AOP概念 浅理解 aop :面 ...
- Spring 的 IOC 和 AOP 的理解
Spring 的 IOC 和 AOP 的理解: https://www.jianshu.com/p/bf1adc3b75e6 对Spring的核心(AOP和IOC)的理解(大白话) https://w ...
- 运用Spring Aop,一个注解实现日志记录
运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- Spring基于AOP的事务管理
Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...
- 学习AOP之透过Spring的Ioc理解Advisor
花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
随机推荐
- Spring Cloud 微服务五:Spring cloud gateway限流
前言:在互联网应用中,特别是电商,高并发的场景非常多,比如:秒杀.抢购.双11等,在开始时间点会使流量爆发式地涌入,如果对网络流量不加控制很有可能造成后台实例资源耗尽.限流是指通过指定的策略削减流量, ...
- vue+mousemove实现拖动,鼠标移动过快拖动就失效
今天用vue+原生js的mousemove事件,写了个拖动,发现只能慢慢拖动才行,鼠标只要移动快了,就失效,不能拖动了: 搞了半天在,总算解决了,但是问题的深层原理还没搞清楚,知道的大侠可以留言分享, ...
- xcrun: error: unable to find utility "instruments", not a developer tool or in PATH
xcrun: error: unable to find utility "instruments", not a developer tool or in PATH 用web ...
- thinkPHP5.0的学习研究【架构】
2017年6月19日18:51:53 架构:1.ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织.2.MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC ...
- php配置opcache
官网地址:http://php.net/opcache 使用下列推荐设置来获得较好的 性能: opcache.memory_consumption=128 opcache.interned_strin ...
- Java引用类型作为形参和返回值
一.什么是引用类型 在Java中引用类型包括三种:类.抽象类.接口. 二.引用类型作为形参使用 1.类作为形参 /** * 类作为形参,实际传递的是该类的对象 */ class Student { p ...
- Android JNI开发之NDK环境搭建
参考:http://www.cnblogs.com/yejiurui/p/3476565.html 谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本, ...
- EasyDSS+EasyNVR实现幼儿园直播/工地直播等分权限观看直播视频的功能
在EasyNVR互联网直播服务器使用说明书中有关于EasyNVR分组的介绍: "EasyNVR的功能定位就是为视频应用层输出视频设备接入/标准视频输出的能力平台层,只做基础的视频通道接入.视 ...
- 【python】-- web开发之jQuery
jQuery jQuery 是一个 JavaScript 函数库,jQuery库包含以下特性(HTML 元素选取.HTML 元素操作.CSS 操作.HTML 事件函数.JavaScript 特效和动画 ...
- Android笔记之OnLongClickListener
OnLongClickListener中的回调函数boolean onLongClick(View v),其返回值的官方释义如下 如果这个回调消耗了长点击,则返回true,否则返回false. 即使翻 ...