Aop(Aspect Orient Programming)面向切面编程。为什么要用Aop?假如项目中已经写好了业务代码,但是客户突然提出要加事务代码,还要加权限控制代码,还要加入日志代码,那么这种情况下怎么办。项目中的方法成千上万,逐个添加显然是不太现实的,最好是将这部分代码抽象成方法添加到项目中,那么问题又来了,怎么调用呢,如果要逐个添加调用那么这么做也没什么意义,最好是我们定义好方法,当那些需要添加事务、权限、日志的方法执行时,系统自动调用我们的事务方法、权限方法、日志方法,而Aop就可以帮我们做到,Aop专门用于处理系统中分布于各个模块的方法的交叉点问题,所谓的交叉点指的就是像事务等很多方法都可能用到的地方,也就是这些方法的交叉点。
Aop是一种编程思想,那么自然就有框架来实现它,Aop框架分为两类,编译时增强框架和运行时增强框架,编译时增强框架如AspectJ,是在编译时就对目标类(目标方法 )进行了增强,通过反编译可以发现,目标方法所在的类的字节码文件里增加了很多内容。而运行时增强框架如springAop,是在程序运行时对目标类生成代理,所以目标类的字节码文件不会发生任何改变,目标方法执行时实际执行的是代理类的方法。(spring的动态代理既可以是jdk的动态代理,与目标类继承相同的接口。也可以是cglib的动态代理,生成目标类的子类),一般来说,编译时增强框架性能要优于运行时增强框架,因为他们只需要一次增强(直接改变.class文件)而不需要每次运行时都进行动态增强,但是缺点也是很明显的,要依赖特殊的编译器才能处理。
Aop的基本概念:切面:以事务为例,把项目中所有添加了事务的方法都看作一个点,把这些点平铺开来形成一个平面,那么就相当于这个平面横切了所有的方法,也就是所谓的切面,这个切面也就是这些方法的交叉关注点,也就是事务功能。连接点:springAop中的连接点总是方法的调用,简单理解就是方法。增强处理:仍以事务为例,spring在程序运行时动态的为需要添加事务的类生成代理对象,那么代理对象的方法就具备了事务功能,那么增强处理作为一个名词理解就是新添加的事务功能,总而言之增强处理可以理解为程序中添加的新功能。切入点:符合某种规则的连接点,以事务为例,就是那些需要添加事务功能的方法,spring会为切入点织入增强处理。目标对象:被织入增强处理的对象。Aop代理:简单理解为增强处理+目标对象=Aop代理。织入:将增强处理添加到目标对象并声称Aop代理的过程叫做织入。
Aop编程最大的优势在于:被代理的类完全可以是纯净的bean,而且代理对于该bean来说是透明的,所以完全可以对bean进行无限制的代理,Spring的Aop是基于动态代理来实现的,因此也具备这种特性。
spring-aop的几种织入形式
Aop编程最大的优势在于:被代理的类完全可以是纯净的bean,而且代理对于该bean来说是透明的,所以完全可以对bean进行无限制的代理,Spring的Aop是基于动态代理来实现的,因此也具备这种特性。
spring-aop的几种织入形式