大白话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,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...
随机推荐
- 二、Android应用的界面编程(一)界面编程与视图(View)组件
Android应用的绝大部分UI组件都放在android.widget包及其子包.android.view包及其子包中,Android应用的所有UI组件都继承了View类.它代表一个空白的矩形区域.V ...
- java Web程序使用wro4j合并、压缩js、css等静态资源
在Web项目中,js.css合并压缩,不仅有利于减少Http请求数量.减少宽带资源占用,还能有效的管理各种js.css的引入,使整个项目更加有序.而对于访问用户来说,其更大的好处是增加了页面的打开速度 ...
- POJ 1845-Sumdiv【经典数学题目---求因子和】
转载请注明出处:http://blog.csdn.net/lyy289065406/article/details/6648539 優YoU http://user.qzone.qq.com/289 ...
- 九度OJ 1181:遍历链表 (链表、排序)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2733 解决:1181 题目描述: 建立一个升序链表并遍历输出. 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1 ...
- [luogu3601]签到题
[luogu3601]签到题 luogu 求\[\sum_{i=l}^ri-\phi(i)\] 一个朴素的想法是枚举l~r,根号求\(\phi\),显然这样是\((r-l)\sqrt r\),时间无法 ...
- [BJWC2012]冻结
[BJWC2012]冻结 luogu BZOJ 分层图最短路,层与层之间连半边权边 #include<bits/stdc++.h> using namespace std; const i ...
- 使用JSTL在页面前的空行怎么去除?
解决的方法是:在每个JSP的头上加上一段代码 <%@ page trimDirectiveWhitespaces="true" %>
- lazyload.js参数说明
lazyload.js是jQuery的一个插件,可以用来实现图片异步加载. lazyload插件如何添加参数: $("img").lazyload({ //参数添加到此位置,建议一 ...
- MySQL查看和修改字符集的方法
一.查看字符集 1.查看MYSQL数据库服务器和数据库字符集 方法一:show variables like '%character%';方法二:show variables like 'collat ...
- LeetCode:柠檬水找零【860】
LeetCode:柠檬水找零[860] 题目描述 在柠檬水摊上,每一杯柠檬水的售价为 5 美元. 顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯. 每位顾客只买一杯柠檬水,然后向 ...