spring专题系列之AOP的理解和分析

今天是五一收假以来的第一天,距离下一周一共还有四天,这周主要是对Spring的重学习。这四天内我将从以下几个角度进行分析和理解。

(1)AOP的理解和分析

(2)IOC的理解和分析

(3)对bean的理解和分析

(4)spring配置文件的理解和分析

首先今天对AOP的理解和分析,对aop的理解也分开阐述,对一个技术的思考,基本上都是从上学时候课本阐述一个新知识的顺序进行的。 第一:什么是AOP?

第二:为什么要引入AOP?或者是AOP解决了什么问题?

第三:如何简单的实现AOP?

第四:AOP对我们写代码时候的思考和帮助是什么?

现在,开始对AOP进行阐述,

1 什么是AOP?

1.1 概念介绍

Spring的使命是简化Java代码开发,aop作为Spring的一个子模块,也不例外。

AOP 是 Aspect Oriented Programming(面向切面编程) 的简称,和OOP(面向对象编程)一样是一种编程思想,是对OOP的一种补充。

如何理解什么是AOP呢?以日志为例,在很多管理系统,比如订单系统、推送系统等等都需要把日志记录下来。如果每个业务逻辑里面都写日志的相关代码,那就重复太多了。

干脆把日志的相关逻辑代码,统一封装起来。然后在需要的地方嵌入即可。AOP也主要就是做嵌入这件事的。看下面这张图。

image

新增订单编辑订单取消订单推送订单日志事务

AOP旨在将横切关注点(crosscutting concern)从业务主体逻辑中进行剥离,实现关注点分离,以提高程序的模块化程度(及业务模块只需关注业务逻辑,无需关注日志、安全、事务等通用逻辑)

上面提到了一些名词,比如说,切面、关注点、横切等,下面对这些名词进行解释。

1.2 名词解释

  1. AOP有自己的一套术语,我们必须了解一下这些行话,才能更好地理解AOP。为了方便大家理解,下面将用课代表收作业作为例子。

    1. 通知 (Advice)

      定义了在收作业前后需要做的事。常见的通知类型有:before、after、after-returning、around等。

    2. 连接点 (JoinPoint)

      连接点指程序运行时允许插入切面的一个点,可以是一个函数、一个包路径、一个类、或者抛出的异常。有点类似于可以收作业的时间点。

    3. 切点(PointCut)

      切点用于定义切面的位置,也就是捕获哪些连接点的调用然后执行"通知"的操作(什么地点)。

    4. 切面(Aspect)

      切面是切点和通知的聚合,定义了在哪一个切点做什么通知。

    5. 目标对象( Target )

      指被切面织入的对象。

    6. 引入(Introduction)

      引入允许我们向现有的类添加新方法或属性。

    7. 织入(Weaving)

      织入是把切面应用到切点对应的连接点的过程。切面在指定连接点被织入到目标对象中。

具体关系使用图形化表示是:

image

2 为什么要引入AOP?

上面是定义,引入AOP的原因肯定是可以解决目前开发中存在的某些痛点:

(1)目前的开发当中,相互之间都是模块化开发,使用AOP可以有效的实现模块化的思路。

(2)将辅助逻辑(日志、安全、监控等)从业务主体逻辑中进行剥离,同步进行开发。

AOP是一种思想,这种思想是把一些业务逻辑剥离开,然后按照主业务逻辑进行组合,最后达到想要的功能逻辑。

3 如何简单的实现AOP?

3.1 AOP编程思路

本图是一个简单的思路。

image

明确需求创建切面类定义切点定义通知思考:要在哪个方法的什么时候做什么事(方法前?方法后? 还是around ?)即选择哪个连接点进行执行通知在切点附近(before?after?) 做什么操作

下面定义一个日志的简单案例,实现AOP。使用的是原始的注解方式:

3.2 案例实现AOP

3.2.1 明确需求

在某个方法上加上@FddLog,就会在执行这个方法的前后,自动输出相应的信息。下面以把大象放进冰箱为例子进行演示:

3.2.2 基本接口和实现

public interface ElephentToRe{
  public void toRe();
}

实现类如下:

public class ElephentToReImpl implements ElephentToRe{
  public void toRe() {
    System.out.println("把大象放冰箱");
  }
}

3.2.3 定义切面和通知

public class ElephentToReHelper{
    public void beforeElephentToRe(){
        System.out.println("把冰箱门打开");
    }
    public void afterElephentToRe(){
        System.out.println("把冰箱门关上");
    }
}

配置就好了

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/aop
  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
  <!-- 定义通知内容,也就是切入点执行前后需要做的事情 -->
  <bean id="elephentToReHelper" class="com.fdd.bean.ElephentToReHelper"></bean>
  <!-- 定义被代理者 -->
  <bean id="elephentToReImpl" class="com.fdd.bean.ElephentToReImpl"></bean>
  <aop:config>
    <aop:aspect ref="elephentToReHelper">
      <aop:before method="beforeElephentToRe" pointcut="execution(* *.toRe(..))" />
      <aop:after method="afterElephentToRe" pointcut="execution(* *.toRe(..))" />
    </aop:aspect>
  </aop:config>
</beans>

3.2.4 测试看效果

public class Test {
  public static void main(String[] args){
    @SuppressWarnings("resource")
    ApplicationContext appCtx = new FileSystemXmlApplicationContext("application.xml");
    ElephentToRe elephentToReImpl = (ElephentToRe)appCtx.getBean("elephentToReImpl");
    elephentToReImpl.toRe();
  }
}

上面的这种方法是通过纯粹的POJO切面来完成的。实现方式也比较简单。

4 我对AOP思想的看法

任何新技术的出现都是为了解决目前开发中存在的某些痛点。对于aop来说,其主要是把一些功能代码进行抽象封装,和主业务逻辑代码进行剥离。在需要的地方进行织入即可。

我的看法是

(1)在平时开发代码的时候,完全可以把一些常见的,常用的功能代码进行封装,尽量做到动态配置。不同的功能模块只需要进行织入即可。

(2)定义业务逻辑的模板,比如说如果要解决某一个业务功能,如果页面类似,可以按照基本的框架进行组合,然后使用配置平台进行可控化配置即可。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 197,000评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,825评论 2 374
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 144,055评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,766评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,639评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,453评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,860评论 3 388
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,492评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,783评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,817评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,624评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,439评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,872评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,075评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,372评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,868评论 2 343
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,075评论 2 338

推荐阅读更多精彩内容