一。首先,对一些基本术语的理解:
1)切面(Aspect):通常是一个类,里面可以定义切入点和通知。比如数据库的事务直接贯穿了整个代码层面,这就是一个切面,它能够在被代理对象的方法之前、之后,产生异常或者正常返回后切入你的代码,甚至代替原来被代理对象的方法,在动态代理中可以把它理解成一个拦截器。
2)通知(Advice):切面的方法。
•前置通知(before):在动态代理反射原有对象方法或者执行环绕通知前执行的通知功能,简单说就是在目标方法被调用之前做增强处理。
•后置通知(after):在动态代理反射原有对象方法或者执行环绕通知后执行的通知功能。无论是否抛出异常,它都会被执行,简单说就是在目标方法被调用之后做增强处理。
•返回通知(afterReturning):在动态代理反射原有对象方法或者执行环绕通知后执行的通知功能。
•异常通知(afterThrowing):在动态代理反射原有对象方法或者执行环绕通知产生异常后执行的通知功能。
•环绕通知(aroundThrowing):在动态代理中,它可以取代当前被拦截对象的方法,通过参数或反射调用被拦截对象的方法。
3)切点(Pointcut):在动态代理中,被切面拦截的方法就是一个切点,切面将可以将其切点和被拦截的方法按照一定的逻辑织入到约定流程当中。
4)连接点(join point):连接点是一个判断条件,由它可以指定哪些是切点。对于指定的切点,Spring会生成代理对象去使用对应的切面对其拦截,否则就不会拦截它。
5)织入(Weaving):织入是一个生成代理对象的过程。实际代理的方法分为静态代理和动态代理。静态代理是在编译class文件时生成的代码逻辑,但是在Spring中并不使用这样的方式,所以我们就不展开讨论了。一种是通过ClassLoader也就是在类加载的时候生成的代码逻辑,但是它在应用程序代码运行前就生成对应的逻辑。还有一种是运行期,动态生成代码的方式,这是Spring AOP所采用的方式,Spring是以JDK和CGLIB动态代理来生成代理对象的。
二。AOP实现的方式主要有以下四种:
•使用ProxyFactoryBean和对应的接口实现AOP。
•使用XML配置AOP。
•使用@AspectJ注解驱动切面。
•使用AspectJ注入切面。
三,示例
1)xml配置aop方式(下面示例把打印日志视为一个切面)
实现类:
切面处理类:
xml配置:
测试类以及执行结果:
2)注解实现方式
实现类:
切面处理类:
xml配置:
测试类:如上。