工作一年多后, 第二次看了韩顺平老师讲的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的更多相关文章

  1. 对 Spring 的核心(AOP 和 IOC)的理解(大白话)

    Spring 首先它是一个开源而轻量级的框架.其核心容器的主要组件是Bean工厂(BeanFactory).Bean工厂使用控制反转(IOC)模式来降低程序代码之间的耦合度,并提供了面向切面编程(AO ...

  2. 大白话讲解IOC和AOP

    IOC和AOP 什么是IOC IoC(Inversion of control)控制反转,它是一种思想,而Spring Framework实现了这一思想.Ioc也称为依赖注入(DI). IOC控制反转 ...

  3. 注解:大话AOP与Android的爱恨情仇

    转载:大话AOP与Android的爱恨情仇 1. AOP与OOP的区别 平时我接触多的就是OOP(Object Oriented Programming面向对象).AOP(Aspect Oriente ...

  4. (五)Spring 中的 aop

    目录 文章目录 AOP概念 AOP原理 AOP术语 **`Spring`** 中的 **`aop`** 的操作 使用 `AspectJ` 实现 `aop` 的两种方式 AOP概念 浅理解 aop :面 ...

  5. Spring 的 IOC 和 AOP 的理解

    Spring 的 IOC 和 AOP 的理解: https://www.jianshu.com/p/bf1adc3b75e6 对Spring的核心(AOP和IOC)的理解(大白话) https://w ...

  6. 运用Spring Aop,一个注解实现日志记录

    运用Spring Aop,一个注解实现日志记录 1. 介绍 我们都知道Spring框架的两大特性分别是 IOC (控制反转)和 AOP (面向切面),这个是每一个Spring学习视频里面一开始都会提到 ...

  7. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  8. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  9. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

随机推荐

  1. 对无向图的深度优先搜索(DFS)

    [0]README 0.1) 本文总结于 数据结构与算法分析, 源代码均为原创, 旨在 理解 如何对无向图进行深度优先搜索 的idea 并用源代码加以实现: 0.2) 本文还引入了 背向边(定义见下文 ...

  2. java 对象占用内存查看 以及JVM级别 方法修改等

    public interface Instrumentation 此类提供检测 Java 编程语言代码所需的服务.检测是向方法中添加字节码,以搜集各种工具所使用的数据.由于更改完全是进行添加,所以这些 ...

  3. angular选择器功能

    1.$event对象    $event对象其实就是潜在的jQuery事件对象,通过$event.currentTarget获取当前元素,通过$event.target获取当前元素的子元素. 例如: ...

  4. 高仿微信app (含有发红包,聊天,消息等)用到 Rxjava+Retrofit+MVP+Glide技术

    https://github.com/GitLqr/LQRWeChat 技术很牛,可以看看

  5. Catalan数以及使用Raney引理证明

    一.Catalan数性质   1.1 令h(0)=1,h(1)=1,catalan数满足递推式:   h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) ...

  6. 【BZOJ1226】[SDOI2009]学校食堂Dining 状压DP

    [BZOJ1226][SDOI2009]学校食堂Dining Description 小F 的学校在城市的一个偏僻角落,所有学生都只好在学校吃饭.学校有一个食堂,虽然简陋,但食堂大厨总能做出让同学们满 ...

  7. 【BZOJ2322】[BeiJing2011]梦想封印 高斯消元求线性基+DFS+set

    [BZOJ2322][BeiJing2011]梦想封印 Description 渐渐地,Magic Land上的人们对那座岛屿上的各种现象有了深入的了解. 为了分析一种奇特的称为梦想封印(Fantas ...

  8. Action获取表单数据的三种方式

    1.使用ActionContext类获取 示例 获取用户提交的用户名和密码 jsp页面 action中的java代码 2.使用ServletActionContext类获取 jsp页面 Java代码 ...

  9. Symfony3 查询搜索功能DQL语句like查询

    //前台页面代码 <form method="GET" action="{{ path('staff_index') }}" name="sea ...

  10. cache:annotation-driven" 的前缀 "cache" 未绑定

    问题: Caused by: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreException: Line 29 in XML ...