AOP 面向切面编程,在软件开发中某些行为对大多数应用是通用的,如性能监视,写日志,事物管理。这些行为嵌在业务逻辑代码中,在很多地方被重复使用。一般把这些行为称为横切关注点。如何把横切关注点从业务代码中分离出来,让业务代码只关注业务本身就是AOP要解决的问题。
aop中的相关概念
连接点(JoinPoint):某个方法的前面或后面,应用程序执行时能在连接点处插入一个切面。如:
切面(aspect):横切关注点被摸块化为类后,这些类被称为切面,通知和切点的结合
通知(Advice):又被称为增强,切面所要完成的工作,一段被织入目标连接点的程序代码。Spring中的五中通知:BeforeAdvice (前置通知),AfterReturningAdvice(后置通知) ,ThrowsAdvice(异常通知) , Around(环绕通知),Introduction(引介通知)
切点(pointcut):通知所要织入的连接点的位置,一般用execution()表达式或正则表达式进行描述。
目标对象(target):增强逻辑的织入目标类。
织入(weaving):将切面应用到目标对象来创建新的代理对象的过程。
代理对象(proxy):一个类被aop织入增强后,所得到的结果类。
引介(introduction):某个类没有实现某个接口,通过引介可以为该类动态的添加该接口的实现逻辑
Spring对AOP的支持 :1.基于代理的AOP 2.@AspectJ注解驱动的切面 3.纯POJO切面 4.注入式AspectJ切面(基于Schema)
Spring aop的底层采用动态代理技术(基于jdk的动态代理和基于CGLib的动态代理)
配置方法
<bean id="playMagic" class="com.aop.PlayMagic"/> --该bean 为目标对象bean <bean id="audience" class="com.aop.Audience"/> --该bean为增强方法所在的bean <aop:config> <aop:aspect ref="audience"> --切面中引用增强 <aop:before method="takeSeats" pointcut="execution(* com.aop.PlayMagic.play(..))"/> --配置引用增强中的某个方法和切点表达式,切点表达式为
</aop:aspect> 目标对象的某个方法
</aop:config>
采用AspectJ注解方式
<aop:aspectj-autoproxy/> --自动代理 <bean id="playMagic" class="com.aop.PlayMagic"/> --目标对象的bean <bean class="com.aop.Audience"/> --增强类bean
增强类
package com.aop; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; @Aspect public class Audience { @Before("execution(* com.aop.PlayMagic.play(..))") public void takeSeats(){ System.out.println("The audience is taking their seats"); } }
还有很多配置的细节在用的时候查文档就行