文档章节

Spring的AOP逐层深入——AOP的基本原理(六)

architect刘源源
 architect刘源源
发布于 2018/01/13 18:23
字数 1614
阅读 18
收藏 5

什么是AOP

 

        AOP(Aspect Oriented Programming),意思是面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP基于IoC基础,是对OOP(Object Oriented Programming,面向对象)的延续。同时,AOP实际是GOF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,提高代码的灵活性和可扩展性,AOP可以说也是这种目标的一种实现。

       AOP将应用系统分为两部分,核心业务逻辑(Core business concerns)及横向的通用逻辑,也就是所谓的方面Crosscutting enterprise concerns,例如,所有大中型应用都要涉及到的持久化管理(Persistent)、事务管理(Transaction Management)、安全管理(Security)、日志管理(Logging)和调试管理(Debugging)等。

 

                   

AOP与OOP的区别

 

        AOP、OOP在字面上虽然非常类似,但却是面向不同领域的两种设计思想。OOP(面向对象编程)针对业务处理过程的实体及其属性和行为进行抽象封装,以获得更加清晰高效的逻辑单元划分。

        而AOP则是针对业务处理过程中的切面进行提取,它所面对的是处理过程中的某个步骤或阶段,以获得逻辑过程中各部分之间低耦合性的隔离效果。这两种设计思想在目标上有着本质的差异。

        上面的陈述可能过于理论化,举个简单的例子,对于“雇员”这样一个业务实体进行封装,自然是OOP/OOD的任务,我们可以为其建立一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。

        同样,对于“权限检查”这一动作片断进行划分,则是AOP的目标领域。而通过OOD/OOP对一个动作进行封装,则有点不伦不类。

       换而言之,OOD/OOP面向名词领域,AOP面向动词领域。

 

基本概念

 

           要想真正的了解AOP,首先要了解几个重要的基本概念:

1、切面(Aspect):对横切性关注点的模块化,其实就是共有功能的实现。如日志切面、权限切面等。

2、连接点(JoinPoint):就是程序在运行过程中能够插入切面的地点。例如,方法调用、异常抛出或字段修改等,但Spring只支持

方法级的连接点。

3、通知(Advice):在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包

括"around"、"before”和"after"等通知。许多AOP框架,包括Spring,都是以拦截器做通知模型, 并维护一个以连接点为中心的拦截

器链。

4、切入点(Pointcut):用于定义通知(Advice)应该切入到哪些连接点(JoinPoint)上。不同的通知通常需要切入到不同的连接点上,这种精准的匹配是由切入点的正则表达式来定义的。

5、目标对象(Target):就是那些即将切入切面的对象,也就是那些被通知的对象。

6、代理对象(Proxy):将通知应用到目标对象之后被动态创建的对象。可以简单地理解为,代理对象的功能等于目标对象的核心

业务逻辑功能加上共有功能。代理对象对于使用者而言是透明的,是程序运行过程中的产物。

7、织入(Weaving):将切面应用到目标对象从而创建一个新的代理对象的过程。这个过程可以发生在编译期、类装载期及运行

期,当然不同的发生点有着不同的前提条件。譬如发生在编译期的话,就要求有一个支持这种AOP实现的特殊编译器;发生在类装

载期,就要求有一个支持AOP实现的特殊类装载器;只有发生在运行期,则可直接通过Java语言的反射机制与动态代理机制来动态

实现。

      我们用一张图将这些概念串联起来,具体的代码在后面的博文中:

 

通知(Advice)类型

 

       为了符合现实的各种需求,通知类型提供了5种,可以对目标方法进行全方位处理;

1、Before advice:在某连接点(JoinPoint)之前执行的通知,但这个通知不能阻止连接点前的执行。

      ApplicationContext中在<aop:aspect>里面使用<aop:before>元素进行声明。

2、After advice:当某连接点退出的时候执行的通知(不论是正常返回还是异常退出)。

      ApplicationContext中在<aop:aspect>里面使用<aop:after>元素进行声明。

3、After returnadvice:在某连接点正常完成后执行的通知,不包括抛出异常的情况。

      ApplicationContext中在<aop:aspect>里面使用<aop:after-returning>元素进行声明。

4、Around advice:包围一个连接点的通知,类似Web中Servlet规范中的Filter的doFilter方法。可以在方法的调用前后完成自定义的

行为,也可以选择不执行。

      ApplicationContext中在<aop:aspect>里面使用<aop:around>元素进行声明。

5、Afterthrowing advice:在方法抛出异常退出时执行的通知。

      ApplicationContext中在<aop:aspect>里面使用<aop:after-throwing>元素进行声明。

 

 

AOP 2种代理的区别


AOP支持2种代理,Jdk的动态代理和CGLIB实现机制。二者有什么区别呢:

 

Jdk基于接口实现:JDK动态代理对实现了接口的类进行代理。

CGLIB基于继承:CGLIB代理可以对类代理,主要对指定的类生成一个子类,因为是继承,所以目标类最好不要使用final声明。 

通常情况下,鼓励使用jdk代理,因为业务一般都会抽象出一个接口,而且不用引入新的东西。如果是遗留的系统,以前没有实现接口,那么只能使用CGLIB。

 

 

AOP配置


Spring AOP配置有两种风格:

 

      XML风格 = 采用声明形式实现Spring AOP 

      AspectJ风格 = 采用注解形式实现Spring AOP

 

     下篇博文,会分别使用两种风格实践一下Spring AOP,敬请关注。

 

© 著作权归作者所有

architect刘源源

architect刘源源

粉丝 153
博文 507
码字总数 903887
作品 0
浦东
程序员
私信 提问
Spring的AOP逐层深入——采用注解完成AOP(七)

上篇博文AOP基本原理6我们介绍了AOP的基本原理,以及5种通知的类型, AOP的两种配置方式:XML配置和Aspectj注解方式。 这篇我们使用注解方式来实现一个AOP,我们先看一下项目的目录。 我们采...

architect刘源源
2018/01/13
1
0
Aspectj与Spring AOP比较

1、简介 今天有多个可用的 AOP 库, 它们需要能够回答许多问题: 是否与用户现有的或新的应用程序兼容? 在哪里可以实现 AOP? 与自己的应用程序集成多快? 性能开销是多少? 在本文中, 我们将...

沈渊
2018/04/18
0
0
Java程序员从笨鸟到菜鸟之(六十七)细谈Spring(一)spring简介

Spring 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。 然而...

长平狐
2012/11/12
72
0
国内一线架构师提供的Spring Boot学习路线

Spring Boot 学习路线,本文计划根据作者多年经验,来分析和制定一个学习使用 Spring Boot技术的步骤路线图。 一、准备工作 俗话说:“工欲善其事必先利其器”。特别是软件开发,这样一个重视...

java高级架构牛人
2018/06/26
0
0
那些年,我们一起追的Spring

学无止境,但仍需及时总结。 自去年开始写作以来,写了一些关于Spring的文章,今天将它们汇总起来,一方面方便大家阅读,另一方面,也是一次小的复盘总结。 IOC 首先是Spring的IOC,也就是控...

SexyCode
2018/08/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

redis实现简单的分布式任务调度

实现方法: 1、通过zset数据结构实现任务排序,value=任务信息,score=任务触发时间(unix时间戳) 2、ZRANGEBYSCORE task_key -inf currentTIme, 获取当前时间以前的所有任务 (消费者定时每...

ccman996
3分钟前
0
0
好程序员web前端分享应该怎样学好web前端?

好程序员web前端分享应该怎样学好web前端?作为一个想学好web前端的新人来说,这是一个很好的问题,所以尽早的选择好方向、规划好自己的学习路线,比别人多一点付出更多的努力,你就算是赢在...

好程序员IT
8分钟前
0
0
mysql 存储过程中使用动态sql语句

简单的存储过程各个关键字的用法: CREATE DEFINER = CURRENT_USER PROCEDURE `NewProc`(in _xnb varchar(50))BEGIN## 定义变量DECLARE _num FLOAT(14,6) DEFAULT 0;## @表示全局变...

文文1
11分钟前
3
0
重磅开源|AOP for Flutter开发利器——AspectD

https://github.com/alibaba-flutter/aspectd 问题背景 随着Flutter这一框架的快速发展,有越来越多的业务开始使用Flutter来重构或新建其产品。但在我们的实践过程中发现,一方面Flutter开发...

zhaowei121
14分钟前
0
0
桌面条目文件规范

原文链接 介绍 KDE和GNOME桌面环境都采用了类似的”桌面条目”格式,或描述特定程序如何启动的配置文件,它在菜单中的显示方式等。统一标准对更大的社区有利。 所有各方都同意这样做,即两个...

electricface
18分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部