AOP 专题
Spring框架有两个核心思想:IOC和AOP
Spring IOC指的是控制翻转,使用普通JAVA Bean,在运行时由Spring容器统一管理和串联,服务于不同的流程,在开发过程中对Spring 容器没有强依赖,便于开发、测试、验证和迁移。
开发业务逻辑时每个业务逻辑的服务组件都是独立的,而不依赖于Spring框架,借助Spring容器对单元测试的支持,通过对下层依赖服务进行Mock,每个业务组件都可以在一定范围内进行单元测试,而不需要启动重型的容器来测试
OOP和AOP都是为了解耦和模块化设计。
AOP通常适用于使用面向对象方法无法抽象的业务逻辑,
例如:日志、安全、事务、应用程序性能 管理(APM,Application Performance Monitoring)等,
使用它们的场景并不能用面向对象的方法来表达和实现,而需要使用切面来表达 ,因为它们可能穿插在程序的任何一个角落里。
AOP是分工细化的过程中,分离关注点,去除重复而提出的一个概念。 目标当然是去除重复,解耦 ,模块化设计
譬如开发人员负责开发功能,功能上线前需要负责安全的部门进行检查,需要网络的部门进行dns或域名的申请或更新配置
但这些东西每次发布都需要做,如果每个团队都有人专门负责安全、网络等这些与业务功能无关的事务,就有冗余。
AOP是Aspect Oriented Programming的缩写,意思是面向切面编程,是一种关注点分离的技术
代码主要就是实现某种特定的业务逻辑。
但是在实际写代码时,往往不能专注于业务逻辑,比如我们写业务逻辑代码的同时,还要写事务管理、缓存、日志等等通用化的功能,而且每个业务功能都要和这些业务功能混在一起,痛苦!
所以,为了将业务功能的关注点和通用化功能的关注点分离开来,就出现了AOP技术。 其实这种模块化通用功能逻辑的做法,一直都在使用,只是没有系统的提出AOP的概念:
譬如Java Web开发中最基本的Filter就是一层一层的切面,突破了之后才能触及Servlet这内核。
但Filter过于简单粗放,只能运行在Servlet之外而不能在之内,能上不能下,稍微细一点的批处理它就不行了,而Spring的AOP可以。
从理论上说,Filter和Spring AOP前者是责任链模式(Intercepter也是),后者是代理模式,性质不同,但从「层层包裹核心」的共同特点看,是一致的。 AOP就是增加了一种解耦的实现方式。
解耦,这是OOP经常提到的词。为了让各个模块更加独立,有人通过面向对象设计出一堆模式剥离代码降低耦合。 AOP和OOP的区别及联系:
AOP是OOP的延续或者可以理解为是OOP编程方式的一种补充。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度考虑程序运行过程。 AOP的作用:常常通过AOP来处理一些具有横切性质的系统性服务,如事物管理、安全检查、缓存、对象池管理等。这些配套服务和当前业务流程无关,但不可缺少。譬如员工获取办公资源的权限管理,工作区域的保洁问题,网络需要IT部门处理 AOP就是把这些代码与核心逻辑代码剥离,其实现方式就是在现有的类或方法的基础上通过"注解"(Java)、"特性"(C#)、"装饰器"(Python)把核心逻辑代码用各个"方面"的代码包裹起来。 面向切面的目标与面向对象的目标没有不同。
一是减少重复,二是专注业务。
相比之下,面向对象是细腻的,用继承和组合的方式,绵绵编织成一套类和对象体系。
而面向切面是豪放的,大手一挥:凡某包某类某开头的方法,一并如斯处理! 《Javascript DOM编程艺术》说,dom是绣花针,innerHTML是砍柴斧。
面向对象和面向切面,也可做如是观。
没有依赖注入,面向切面就失去立足之本。 没有面向切面,依赖注入之后也只好在各个方法里下死力气写重复代码,或者搞出来一个超级复杂的抽象基类。 同时有了这两者,才真正能履行拆分、解耦、模块化、约定优于配置的思想,才真正能实现合并重复代码、专注业务逻辑的愿望。 不过,如果能用「绣花针」OOP的设计模式实现,还是不建议轻易动用AOP这「劈柴刀」,不得已才用之 总结:
过程式编程是一维的,如果不通过文件名以及函数名分割,所有函数就毫无组织了;
面向对象编程是二维的,相比过程式增加了一个维度,可以从语言的层面通过“主语”组织代码;
而面向结合面向对象编程是三维的,相比单单的面向对象编程则又增加了“方面”维度。 AOP具体实现
AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),目前AOP具体实现有以下几个项目:
AspectJ(TM):创建于Xerox PARC. 有近十年历史,成熟
缺点:过于复杂;破坏封装;需要专门的Java编译器。
动态AOP:使用JDK的动态代理API或字节码Bytecode处理技术。 程序需要状态,但对象不需要状态。
如果对象有了状态,就会引发烦人的多线程问题,在集群环境下更是麻烦。
程序的状态,统一由数据库,缓存,任务队列这些外部容器来容纳,在处理时,仅仅在对象的方法中以局部变量的面目偶尔出现,被封在线程内部,朝生夕灭,任由回收。
状态:请求+状态==完成一次请求所需的全部数据。 譬如token中带有用户信息,服务器通过解码拿到这token中的信息,+ 请求中的业务数据,完成一次操作。 由于这次请求的数据,一次请求都携带了,不依赖服务器中相关数据,譬如Web服务器上中心化存储的sessionId。
因此这次使用token完成一次请求,称为无状态的
依赖服务器端中心化存储的sessionId,才能完成一次,这种请求称为 有状态的【服务器端是存有状态的】
AOP是什么?
AOP(Aspect-Oriented Programming),面向切面编程,看着是跟OOP(面向对象编程)挺相近的,但实际上又有什么区别呢?
OOP具有封装,继承,多态等东西来定义从上到下这种层次关系(瀑布流式的),但要想实现从左到右的关系的话就开始有点水土不服了,例如用户的权限控制,操作日志等,这些与我们要实现的核心功能不大有关系的东西散布在我们代码的周边,显示十分不好看。
于是我们引入了AOP的模式。
我们通常在实现一个页面逻辑的时候,通常伴随着操作日志,安全监测,事务处理等几个逻辑,在实现逻辑的时候都要写一大堆这种代码。
而AOP就是将这些与主体业务无关,但又有为业务提供服务的逻辑代码封装起来,降低模块之间的耦合度。如图所示中的圆柱体好比如我们的业务流程,aop代表的是那个横向的操作,俗称切面编程。
或许上面的这些理论有点头疼,对于AOP我的大体理解是:将那些与业务核心不大相关的杂七杂八的东西独立开,每次实现了业务核心之前或之后,调用一下对应的方法。
AOP这种切面编程能干很多事情,例如验证登陆,权限,性能检测,错误信息记录等等,AOP的目的就是将这些东西分离开来,让开发人员专注与核心关注点
http://www.cnblogs.com/powerdk/p/4150112.html
AOP 专题的更多相关文章
- Spring中的AOP 专题
Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...
- 【spring-boot】spring aop 面向切面编程初接触--切点表达式
众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...
- spring入门(14)
AOP是一个新的专题,基础部分主要是入门 后续的五.六.七都属于AOP专题: 所以有必要对这三章要学什么有个全局的认识. 1 概要 1 什么是AOP及实现方式 介绍了AOP的用途,以及大致的实现方案 ...
- [.NET领域驱动设计实战系列]专题九:DDD案例:网上书店AOP和站点地图的实现
一.引言 在前面一专题介绍到,要让缓存生效还需要实现对AOP(面向切面编程)的支持.所以本专题将介绍了网上书店案例中AOP的实现.关于AOP的概念,大家可以参考文章:http://www.cnblog ...
- Spring面试专题之aop
1.背景 aop是编程中非常非常重要的一种思想,在spring项目中用的场景也非常广 2.面试问题 2.1.简单的面试问题 1.什么是aop,aop的作用是什么? 面向切面编程(AOP)提供另外一种角 ...
- [.NET领域驱动设计实战系列]专题十一:.NET 领域驱动设计实战系列总结
一.引用 其实在去年本人已经看过很多关于领域驱动设计的书籍了,包括Microsoft .NET企业级应用框架设计.领域驱动设计C# 2008实现.领域驱动设计:软件核心复杂性应对之道.实现领域驱动设计 ...
- [.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现
一.引言 在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证消息的顺序处理,并且具有良好的可扩展性.但是上一专题消息队列是基于内存中队列对象来实现,这样实现有一 ...
- [.NET领域驱动设计实战系列]专题七:DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能
一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己的订单状态看到店家已经发货.从上面的业务逻辑可以看出,当用户 ...
- 利用Spring AOP自定义注解解决日志和签名校验
转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...
随机推荐
- Oracle APEX 4.2公布RESTful Webservice
Purpose This tutorial covers creating a RESTful Web Service and accessing the Web Service through an ...
- Day5上午解题报告
预计分数:100+40+30=170 实际假分数:0+0+0=0 CE*3 实际真分数:60+50+0=110 老师没把我的程序放的文件夹里面,于是..... T1 https://www.luogu ...
- Spider_req
requests模块 安装(用管理员身份去打开Anaconda Prompt) conda install requests python -m pip install requests # 以管理员 ...
- Keil 编译环境之在线仿真调试问题
一.问题现象: 这几天刚开始上手STM32,使用Keil 环境进行编程,然后使用ULINK2进行在线仿真,在按键处理函数程序中设置断点,却发现按了按键程序没有停在设置的断点,程序正常运行,如下图所示, ...
- Spring学习总结(5)——IOC注入方式总结
一.构造注入 在类被实例化的时候,它的构造方法被调用并且只能调用一次.所以它被用于类的初始化操作.<constructor-arg>是<bean>标签的子标签.通过其<v ...
- ArcGIS Engine 线段绘制
转自ArcGIS Engine 线段绘制研究 基本步骤 构建形状 1. 创建 IPoint IPoint m_Point = new PointClass(); m_Point.PutCoords(x ...
- [Vue + TS] Create Type-Safe Vue Directives in TypeScript
Directives allow us to apply DOM manipulations as side effects. We’ll show you how you can create yo ...
- Android滚轮选择器实现
思路: 1.布局,整个控件的布局,事实上就是用代码取带xml来实现当前布局 2,能够滑动的(即滚轮).事实上是一个ScrollView 3.推断滑动状态的,有protected void onScro ...
- HTML基础第五讲---控制表格及其表项的对齐方式
转自:https://i.cnblogs.com/posts?categoryid=1121494 缺省情况下,表格在浏览器屏幕上左对齐,你可以使用<TABLE>的ALIGN属性来指定表格 ...
- 从大整数乘法的实现到 Karatsuba 快速算法
Karatsuba 快速乘积算法是具有独特合并过程(combine/merge)的分治算法(Karatsuba 是俄罗斯人).此算法主要是对两个整数进行相乘,并不适用于低位数(如 int 的 32 位 ...