Spring框架有两个核心思想:IOC和AOP

Spring IOC指的是控制翻转,使用普通JAVA Bean,在运行时由Spring容器统一管理和串联,服务于不同的流程,在开发过程中对Spring 容器没有强依赖,便于开发、测试、验证和迁移。
开发业务逻辑时每个业务逻辑的服务组件都是独立的,而不依赖于Spring框架,借助Spring容器对单元测试的支持,通过对下层依赖服务进行Mock,每个业务组件都可以在一定范围内进行单元测试,而不需要启动重型的容器来测试

OOP和AOP都是为了解耦和模块化设计。

AOP通常适用于使用面向对象方法无法抽象的业务逻辑,
例如:日志、安全、事务、应用程序性能 管理(APM,Application Performance Monitoring)等,
使用它们的场景并不能用面向对象的方法来表达和实现,而需要使用切面来表达 ,因为它们可能穿插在程序的任何一个角落里。

AOP是分工细化的过程中,分离关注点,去除重复而提出的一个概念。 目标当然是去除重复解耦模块化设计
譬如开发人员负责开发功能,功能上线前需要负责安全的部门进行检查,需要网络的部门进行dns或域名的申请或更新配置

但这些东西每次发布都需要做,如果每个团队都有人专门负责安全、网络等这些与业务功能无关的事务,就有冗余。

  1. AOPAspect Oriented Programming的缩写,意思是面向切面编程,是一种关注点分离的技术
  2. 代码主要就是实现某种特定的业务逻辑。
  3. 但是在实际写代码时,往往不能专注于业务逻辑,比如我们写业务逻辑代码的同时,还要写事务管理、缓存、日志等等通用化的功能,而且每个业务功能都要和这些业务功能混在一起,痛苦!
  4. 所以,为了将业务功能的关注点通用化功能的关注点分离开来,就出现了AOP技术。
  5.  
  6. 其实这种模块化通用功能逻辑的做法,一直都在使用,只是没有系统的提出AOP的概念:
  7. 譬如Java Web开发中最基本的Filter就是一层一层的切面,突破了之后才能触及Servlet这内核。
  8. Filter过于简单粗放,只能运行在Servlet之外而不能在之内,能上不能下,稍微细一点的批处理它就不行了,而SpringAOP可以。
  9. 从理论上说,FilterSpring AOP前者是责任链模式(Intercepter也是),后者是代理模式,性质不同,但从「层层包裹核心」的共同特点看,是一致的。
  10.  
  11. AOP就是增加了一种解耦的实现方式。
  12. 解耦,这是OOP经常提到的词。为了让各个模块更加独立,有人通过面向对象设计出一堆模式剥离代码降低耦合。
  13.  
  14. AOPOOP的区别及联系:
  15. AOPOOP的延续或者可以理解为是OOP编程方式的一种补充。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者被调用者之间的解耦,AOP可以说也是这种目标的一种实现。
  16. 面向对象编程(OOP)是从静态角度考虑程序结构,面向切面编程(AOP)是从动态角度考虑程序运行过程。
  17.  
  18. AOP的作用:常常通过AOP来处理一些具有横切性质的系统性服务,如事物管理、安全检查、缓存、对象池管理等。这些配套服务和当前业务流程无关,但不可缺少。譬如员工获取办公资源的权限管理,工作区域的保洁问题,网络需要IT部门处理
  19.  
  20. AOP就是把这些代码与核心逻辑代码剥离,其实现方式就是在现有的类或方法的基础上通过"注解"Java)、"特性"C#)、"装饰器"(Python)把核心逻辑代码用各个"方面"的代码包裹起来。
  21.  
  22. 面向切面的目标与面向对象的目标没有不同。
  23. 一是减少重复,二是专注业务
  24. 相比之下,面向对象是细腻的,用继承和组合的方式,绵绵编织成一套类和对象体系。
  25. 而面向切面是豪放的,大手一挥:凡某包某类某开头的方法,一并如斯处理!
  26.  
  27. Javascript DOM编程艺术》说,dom是绣花针,innerHTML是砍柴斧。
  28. 面向对象和面向切面,也可做如是观。
  29. 没有依赖注入,面向切面就失去立足之本。
  30.  
  31. 没有面向切面,依赖注入之后也只好在各个方法里下死力气写重复代码,或者搞出来一个超级复杂的抽象基类。
  32.  
  33. 同时有了这两者,才真正能履行拆分、解耦、模块化、约定优于配置的思想,才真正能实现合并重复代码、专注业务逻辑的愿望。
  34.  
  35. 不过,如果能用「绣花针」OOP的设计模式实现,还是不建议轻易动用AOP这「劈柴刀」,不得已才用之
  36.  
  37. 总结:
  38. 过程式编程是一维的,如果不通过文件名以及函数名分割,所有函数就毫无组织了;
  39. 面向对象编程是二维的,相比过程式增加了一个维度,可以从语言的层面通过“主语”组织代码;
  40. 而面向结合面向对象编程是三维的,相比单单的面向对象编程则又增加了“方面”维度。
  41.  
  42. AOP具体实现
  43. AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),目前AOP具体实现有以下几个项目:
  44. AspectJ(TM):创建于Xerox PARC. 有近十年历史,成熟
  45. 缺点:过于复杂;破坏封装;需要专门的Java编译器。
  46. 动态AOP:使用JDK的动态代理API或字节码Bytecode处理技术。
  47.  
  48. 程序需要状态,但对象不需要状态。
  49. 如果对象有了状态,就会引发烦人的多线程问题,在集群环境下更是麻烦。
  50. 程序的状态,统一由数据库,缓存,任务队列这些外部容器来容纳,在处理时,仅仅在对象的方法中以局部变量的面目偶尔出现,被封在线程内部,朝生夕灭,任由回收。
    状态:请求+状态==完成一次请求所需的全部数据。 譬如token中带有用户信息,服务器通过解码拿到这token中的信息,+ 请求中的业务数据,完成一次操作。 由于这次请求的数据,一次请求都携带了,不依赖服务器中相关数据,譬如Web服务器上中心化存储的sessionId
  1. 因此这次使用token完成一次请求,称为无状态的
    依赖服务器端中心化存储的sessionId,才能完成一次,这种请求称为 有状态的【服务器端是存有状态的】

AOP是什么?
AOP(Aspect-Oriented Programming),面向切面编程,看着是跟OOP(面向对象编程)挺相近的,但实际上又有什么区别呢?
OOP具有封装,继承,多态等东西来定义从上到下这种层次关系(瀑布流式的),但要想实现从左到右的关系的话就开始有点水土不服了,例如用户的权限控制,操作日志等,这些与我们要实现的核心功能不大有关系的东西散布在我们代码的周边,显示十分不好看。
于是我们引入了AOP的模式。

我们通常在实现一个页面逻辑的时候,通常伴随着操作日志,安全监测,事务处理等几个逻辑,在实现逻辑的时候都要写一大堆这种代码。
而AOP就是将这些与主体业务无关,但又有为业务提供服务的逻辑代码封装起来,降低模块之间的耦合度。如图所示中的圆柱体好比如我们的业务流程,aop代表的是那个横向的操作,俗称切面编程。
或许上面的这些理论有点头疼,对于AOP我的大体理解是:将那些与业务核心不大相关的杂七杂八的东西独立开,每次实现了业务核心之前或之后,调用一下对应的方法。

AOP这种切面编程能干很多事情,例如验证登陆,权限,性能检测,错误信息记录等等,AOP的目的就是将这些东西分离开来,让开发人员专注与核心关注点

http://www.cnblogs.com/powerdk/p/4150112.html

AOP 专题的更多相关文章

  1. Spring中的AOP 专题

    Caused by: java.lang.IllegalArgumentException: ProceedingJoinPoint is only supported for around advi ...

  2. 【spring-boot】spring aop 面向切面编程初接触--切点表达式

    众所周知,spring最核心的两个功能是aop和ioc,即面向切面,控制反转.这里我们探讨一下如何使用spring aop. 1.何为aop aop全称Aspect Oriented Programm ...

  3. spring入门(14)

    AOP是一个新的专题,基础部分主要是入门 后续的五.六.七都属于AOP专题: 所以有必要对这三章要学什么有个全局的认识. 1 概要 1 什么是AOP及实现方式 介绍了AOP的用途,以及大致的实现方案 ...

  4. [.NET领域驱动设计实战系列]专题九:DDD案例:网上书店AOP和站点地图的实现

    一.引言 在前面一专题介绍到,要让缓存生效还需要实现对AOP(面向切面编程)的支持.所以本专题将介绍了网上书店案例中AOP的实现.关于AOP的概念,大家可以参考文章:http://www.cnblog ...

  5. Spring面试专题之aop

    1.背景 aop是编程中非常非常重要的一种思想,在spring项目中用的场景也非常广 2.面试问题 2.1.简单的面试问题 1.什么是aop,aop的作用是什么? 面向切面编程(AOP)提供另外一种角 ...

  6. [.NET领域驱动设计实战系列]专题十一:.NET 领域驱动设计实战系列总结

    一.引用 其实在去年本人已经看过很多关于领域驱动设计的书籍了,包括Microsoft .NET企业级应用框架设计.领域驱动设计C# 2008实现.领域驱动设计:软件核心复杂性应对之道.实现领域驱动设计 ...

  7. [.NET领域驱动设计实战系列]专题八:DDD案例:网上书店分布式消息队列和分布式缓存的实现

    一.引言 在上一专题中,商家发货和用户确认收货功能引入了消息队列来实现的,引入消息队列的好处可以保证消息的顺序处理,并且具有良好的可扩展性.但是上一专题消息队列是基于内存中队列对象来实现,这样实现有一 ...

  8. [.NET领域驱动设计实战系列]专题七:DDD实践案例:引入事件驱动与中间件机制来实现后台管理功能

    一.引言 在当前的电子商务平台中,用户下完订单之后,然后店家会在后台看到客户下的订单,然后店家可以对客户的订单进行发货操作.此时客户会在自己的订单状态看到店家已经发货.从上面的业务逻辑可以看出,当用户 ...

  9. 利用Spring AOP自定义注解解决日志和签名校验

    转载:http://www.cnblogs.com/shipengzhi/articles/2716004.html 一.需解决的问题 部分API有签名参数(signature),Passport首先 ...

随机推荐

  1. [NOI.AC#31]MST 计数类DP

    链接 注意到 \(n\) 只有40,爆搜一下发现40的整数拆分(相当于把 \(n\) 分成几个联通块)很少 因此可以枚举联通块状态来转移,这个状态直接用vector存起来,再用map映射,反正40也不 ...

  2. Android学习笔记进阶15之Shader渲染

    Android提供的Shader类主要是渲染图像以及一些几何图形. Shader有几个直接子类: BitmapShader    : 主要用来渲染图像 LinearGradient  :用来进行线性渲 ...

  3. 单位阶跃函数(Heaviside/unit step function)—— 化简分段函数

    注意,单位阶跃函数一种不连续函数. 1. 常见定义 最经典的定义来自于 Ramp function(斜坡函数,max{x,0})的微分形式: H(x)=ddxmax{x,0} 2. 化简分段函数 如对 ...

  4. eclipse创建maven

    第一步: 第二步 第三步: 第四步: 第五步: 第六步: <?xml version="1.0" encoding="UTF-8"?> <we ...

  5. APM2.8 Rover 自己主动巡航车设计(固件安装和设置)

    1.2 APM2.8软件安装与固件下载 下载Mission Planner这个地面基站软件,这里介绍的是windoews平台下的,在MAC或者linux下能够使用QGroundCont基于QT编写的地 ...

  6. 24岁程序员, 一个人撑起App开发项目

    "疲惫吾心,怎样躲藏! 四处荒芜,怎话忧伤?"临近中秋,看到艾瑞斯的QQ签名,无尽的伤感.这个年仅24的青年.连续3年没有回家了,近期一个月总是失眠,没有家人的陪伴,就连女朋友都没 ...

  7. Redis原理(一)

    基础和应用 1.Redis是远程调用技术的首字母缩写. 2.Redis可以用来做什么? Redis可以用来做缓存. 分布式锁 3.Redis的应用举例 记录帖子的点赞数.评论数和点击数.(使用HASH ...

  8. webpack4 多页面,多环境配置,逐行解释

    项目需求制作为新的app的分享页,故需要制作多页面应用,那既然app是新的,这边我们也要更新上,经过多方考察(度娘)下,综合了一些他人的优点并结合项目实况产生了此文. 本文为了解释详细,篇幅可能会较长 ...

  9. 【Codeforces Round #432 (Div. 1) A】 Five Dimensional Points

    [链接]点击打开链接 [题意] 给你n个5维的点. 然后让你以其中的某一个点作为起点a. 另选两个点b,c. 组成向量a->b,a->c 如果所有的a->b和a->c的夹角都是 ...

  10. 字符串中的空格替换问题(Java版)

    解决方式一:时间复杂度为O(n^2) 解决方式二:时间复杂度为O(n) 代码实现: package string; public class SpaceStringReplace2 { //len为数 ...