AOP
什么是AOP?
Aspect Oriented Programming 面向切面编程。
AOP常见的地方:最常见的就是我们很多框架当中用到的拦截器。
AOP的用途: 事务管理,安全检查,日志记录,缓存,对象池管理等。
AOP的基本概念
AOP从程序的运行角度考虑程序的流程,提取业务处理过程的切面,AOP面向的是程序运行过程中的各个步骤,希望以更好的方式来组合程序运行过程的各个步骤。
AOP框架并不与特定的业务代码耦合,AOP框架能够处理程序执行中的特定切入点(PointCut),而不与具体类耦合。
AOP框架的特点:
#1,各步骤之间良好的隔离性。
#2,源代码无关性。
下面是AOP中的常用术语:
#1, 切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点可能横切多个对象,所以尝尝也
称为横切关注点。
#2,连接点(Joinpoint):程序执行过程中明确的点,如方法的调用,或者异常的抛出。Spring AOP中,连接点总是方法的调用。
#3,增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有"around","before","after"等.
#4, 切入点(Pointcut): 可以插入增加处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。
#5,引入:将方法或者字段添加到被处理的类中。Spring允许引入新的接口到任何被处理的对象。
#6,目标对象: 被AOP框架进行增强处理的对象,也被称为被增强的对象。如果AOP框架是通过运行时代理来实现的,那么这个对象将是一个被代理的对象。
#7, AOP代理:AOP框架创建的对象,简单的说,代理就是对目标对象的加强。Spring中的AOP代理可以是JDK的动态代理,也可以是CGLIB代理。前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理。
#8, 织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程就是织入。织入有两种实现方式:编译时增强和运行时增强。Spring和其他纯Java AOP框架一样,在运行时完成织入。
Spring的AOP支持
Spring中的AOP代理由Spring的IOC容器负责生成,管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其他Bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了。
Spring也可以使用CGLIB代理,在需要代理类而不是代理接口的时候,Spring自动会切换为使用CGLIB代理。但Spring推荐使用面向接口变成,因此业务对象通常都会实现一个或多个接口,此时默认将使用JDK动态代理,但也可以强制使用CGLIB。
package com.wangbiao.aspect; import java.sql.Date; import org.aspectj.lang.annotation.AfterReturning; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.core.annotation.Order; @Aspect @Order(value=2) public class LoginAspect { @Before("execution(* com.wangbiao.target.imp.*.*(..))") public void authority() { System.out.println("模拟执行权限检查"); } // // @AfterReturning(returning ="rvt",pointcut="execution(* com.wangbiao.target.imp.*.*(..))") // public void log(String rvt) // { // System.out.println("记录log " + rvt); // } @AfterReturning(pointcut="execution(* com.wangbiao.target.imp.*.*(..)) && args(name)") public void log2(String name) { System.out.println("记录log " + name); } @AfterReturning(pointcut="execution(* com.wangbiao.target.imp.*.*(..)) && args(name,birthday)") public void log3(String name,Date birthday) { System.out.println("记录log "); } // // @AfterThrowing(throwing ="exp",pointcut="execution(* com.wangbiao.target.imp.*.*(..))") // public void handleException(Throwable exp) // { // System.out.println("处理异常 " + exp.getCause()+"--"+exp.getMessage()); // } // //// @AfterThrowing(throwing ="exp",pointcut="execution(* com.wangbiao.target.imp.*.*(..))") //// public void handleException(NullPointerException exp) //// { //// System.out.println("处理异常 " + exp.getCause()+"--"+exp.getMessage()); //// } // // @After("execution(* com.wangbiao.target.imp.*.*(..))") // public void handleExceptionII() // { // System.out.println("处理异常 "); // } // // @Around("execution(* com.wangbiao.target.imp.*.*(..))") // public void remark(ProceedingJoinPoint pj) throws Throwable // { // System.out.println("XXXXXXXXXXXX---before"); // System.out.println(pj.getTarget()+"--"+pj.getSignature().getName()+"--"+pj.getArgs()); // pj.proceed(); // //pj.proceed(new Object[]{"hee"}); // System.out.println("XXXXXXXXXXXX---after"); // } }