AOP这一术语,近些年愈加流行了。在java开发者社区里,学习使用Spring开发框架时,一定会涉及到AOP。不了解AOP不影响学习和使用Spring框架,不过在了解AOP以后,对于开发企业级应用则更加有利。本文视图以通俗的方式,整理一下AOP知识,以供初次接触的同行参考。java
AOP的全称是 面向方面编程 (Aspect-Oriented Programming),这是Gregor Kiczales于1996年在PARC提出的一个术语。AOP是一种与OOP大相径庭的看待应用程序结构的方式,按照AOP的观念,系统被分解为方面(aspect)或者关注点(concern),而不是对象。编程
这儿将AOP与OOP(面向对象编程 Object-Oriented Programming)相比较。Java开发者通常都比较熟悉OOP,你们都知道,OOP方式带来的最大好处就是代码复用,经过三大特性:封装、继承、多态,来复用代码。不过,若与AOP相比较,OOP的代码复用成程度,还差了那么一点儿。安全
通常状况下,OOP可以很好地避免代码重复。具体继承能够帮助咱们在不一样类型之间共享相同的行为,多态可让咱们能够用相同的方式处理不一样类型的对象,将注意力集中到它们的共同之处。可是,有些时候,咱们没法用OOP避免代码重复,或者没法用OOP获得一个优雅的解决方案。框架
举一个很简单的栗子,假设咱们有一个类,类里有一个公开方法是用来验证用户合法性的。那么这个公开方法,必然会其它不少类里被调用,并且调用方式都同样,伪代码以下ConcreteClassInstance.auth(userInstance)
。虽然重复的地方只是这一行,但这种代码将毫无规律地散布在整个对象模型中,形成没法避免代码的重复。模块化
这行代码的关注点,即方面,就是用户合法性校验。采用AOP的话,咱们能够达到这样的效果:仅在一个地方声明:当某某条件发生时,进行用户合法性校验。权威一点的解释就是:咱们能够单独编写用户和合法性校验的代码,将其包装成一个方面(aspect),而后咱们能够告诉AOP实现产品,如何在将方面织入(weave)到程序流程之中。具体的织入策略也有好几种,好比:代码生成和预编译,动态字节码生成、JavaEE的动态代理。学习
AOP的目标是将横切行(crosscutting)的问题以一种更加通用的方式模块化,从而提高程序的模块化程度。什么是横切性问题?即一个关注点(好比用户合法性检查)的实现代码,散落在不少个类或方法之中。不少企业级问题都具备横切性,好比事物管理、安全性、资源相关操做。代理