Spring AOP
AOP:Aspect Oriented Programming,意思为面向切面的编程,通过预编译方式和运行期动态代理的方式实现程序功能的统一维护的一种技术。DI有助于应用对象之间的解耦,而AOP可以实现横切关注点与它们所影响的对象之间的解耦。
它的应用场景是:日志记录、性能统计、安全控制、事务处理、异常处理等。
实现方式:
➢ 预编译
AspectJ
➢ 运行期动态代理(JDK动态代理、CGLib动态代理)
AOP中几个相关的概念
➢ 通知(Advice):在切面的某个特定的连接点上执行的动作;
➢ 连接点(Joinpoint):程序执行过程中的某个特定的点;
➢ 切点(Pointcut):匹配连接点的断言,在AOP中通知和一个切入点表达式关联;
➢ 切面(Aspect):切面是通知和切点的集合。通知和切点共同定义了切面的全部内容-它是什么,在何时和何处完成其功能。
➢ 引入(Introduction):在不修改代码的前提下,为类添加新的方法和属性;
➢ 织入(Weaving):把切面连接到其它的应用程序类型或者对象上,并创建一个被通知的对象,分为:编译时织入、类加载时织入和执行时织入。
Advice的类型
➢ 前置通知(Before advice):在某连接点(join point)之前执行的通知,但不能阻止连接点前的执行;
➢ 返回后的通知(After returning Advice):在某个连接点(join point)正常完成后执行的通知;
➢ 抛出异常后的通知(After throwing advice):在方法抛出异常后执行的通知;
➢ 后通知(After(finally) advice):当某个连接点退出的时候执行的通知
➢ 环绕通知(Around Advice):包围一个连接点(join point)的通知
Spring AOP目前支持方法执行连接点,它不是为了提供最完整的AOP实现,而是侧重于提供一种AOP实现和Spring IOC容器之间的整合。Spring AOP中默认使用标准的JavaSE动态代理作为AOP代理,这使得任何借口都可以被代理;Spring AOP中也可以使用CGLIB代理(如果一个业务对象并没有实现一个接口)
AspectJ是编译期的AOP,检查代码并匹配连接点与切入点的代价是昂贵的。一个好的切入点应该包括以下几点:
—选择特定类型的连接点,如:execution,get,set,call,handler
—确定连接点范围,如within,withincode
—匹配上下文信息,如this,target,@annotation