前言
AOP(aspect oriented program),面向切面编程。
利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
AOP代表的是一个横向的关系,程序是顺序执行的,可以简单理解为线性执行,自上而下,就象一条线,所谓切面编程就是,在这条线的某一点(切点)处切开,放入另一个程序(增强处理),这个过程就是我们常说的织入,而被切入处可以用几何常识形象的称之为切面。
基本概念
名词介绍
**OOP(Object Oriented Program):**面向对象编程。
**连接点(join point):**每一个应用程序中都有很多的连接点(每一个方法都是连接点),这些连接点可以作为切入点(Spring只支持方法类型的连接点)
**切入点(pointcut):**标记的一个位置(需要做增强处理的位置),有很多的连接点,但是具体织入哪个连接点呢?需要通过切入点做一个标记
**增强/通知(advice):**要在切点处做的事情就是通知 织入到目标对象上的一段代码
**目标对象(target):**被代理的对象
**织入(waving):**将增强处理通过切点应用到目标对象创建新的代理对象的过程
**代理对象(proxy):**目标对象被织入增强之后,就产生了一个代理类
**切面(aspect):**增强+切点 既包括了横切逻辑的定义,也包括了连接点的定义,Spring AOP就是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接点中
使用AOP的好处
使用AOP能够减少大量的重复代码,但这不是AOP全部的好处,AOP提供了另一种编程处理的思路,这一点尤为重要。
我们传统的编程思路是顺序化垂直化编程的,都是一个逻辑执行完毕执行另一个逻辑。而AOP提供了另一种思路,在不影响正常业务逻辑的同时,对代码的功能进行增强,就像是加buff。
Spring AOP的实现原理
Spring AOP的实现使用了代理模式,下面我们做详细的分析。
代理模式
什么是代理呢?打个比方,在生活中我们租房子的时候一般会找房产中介,通过中介了解房子的信息,并且租到对应的房子,中介此时就是代理对象,他可以代表房东(原对象)但是本质上并不是院对象。Java代理也就是这样,当我们需要使用某一对象的时候,不直接调用该对象,而是调用一个代理对象,由创建的代理对象来控制对原对象的引用。
代理对象内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象。同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装。
代理设计模式是Java常见的设计模式之一,在此部做详细的讲解,写有设计模式系列文章。
名词介绍
核心功能类(目标类):在里面只写核心功能,不写公共功能
代理类:可以用来代替核心功能类的一个类;需要实现核心功能类所实现的所有接口:1.代理类跟目标类有相同的功能;2.代理 对象要能够在目标对象的所有位置出现
静态代理:在编译时,代理类已经存在
动态代理:在编译时代理类不存在,在运行时动态创建代理对象。动态代理不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java反射机制可以生成任意类型的动态代理类。
AOP实现原理
AOP实现的关键在于AOP框架自动的创建代理,AOP代理分为两类:静态代理和动态代理。
**静态代理:**使用AOP框架提供的命令进行编译,从而在编译阶段就可以生成AOP代理类,因此也称为编译时增强。Aspectj为代表。
**AspectJ:**aop的java实现方案,是一种编译期的用注解形式实现的AOP,Spring整合了aspectj,在Spring体系中可以使用aspectj语法来实现aop。
**动态代理:**在运行时借助于JDK动态代理,CGLIB等在内存中临时生成AOP动态代理类,因此也被称为运行时增强。
AspectJ 采用编译时生成 AOP 代理类,因此具有更好的性能,但需要使用特定的编译器进行处理;而 Spring AOP 则采用运行时生成 AOP 代理类,因此无需使用特定编译器进行处理。实现的技术是JDK提供的动态代理技术 和 CGLIB(动态字节码增强技术)。
JDK动态代理
CGLIB动态代理
使用场景
Spring AOP开发步骤
以基本的事务处理为例来说明Spring AOP的使用
-
定义核心功能类(目标类)
-
定义增强处理类
-
把目标类和增强处理类交给Spring管理
-
使用aop标签配置切入点,做织入处理
增强处理/通知
参考资料
http://www.cnblogs.com/xiaoxi/p/5945707.html
http://blog.csdn.net/csdn_terence/article/details/55804421
http://www.cnblogs.com/xiaoxi/p/5981514.html
https://juejin.im/post/5a3201ff6fb9a0450f21f3ea
http://www.codeceo.com/article/learn-spring.html
我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。
永远相信美好的事情即将发生。