1.一些概念
1. JoinPoint:连接点(执行点 + 方位,执行点可以理解为某方法,方位,可以理解为方法调用前,或者后)
程序中的一些点,比如方法调用前,方法调用后,方法抛出异常后。spring也只支持方法调用前,方法调用后,方法抛出异常后这些点。
也就是说spring也只能在这些点上织入逻辑。
2. Pointcut: 切点 (只是描述执行点)
连接点很多,用来刻画你关注的连接点。切点可以理解为一组连接点组成的集合。
3. Advice:增强
增强是织入到目标类连接点上的一段程序代码。
BeforeAdvice, AfterRetuningAdvice,ThrowsAdvice 带方位的增强。
4. Target:目标对象
增强织入的类
2. Spring AOP
spring aop通过动态代理的机制,将增强逻辑织入目标对象,所以不需要特殊的编译器,也不需要特殊的类加载器。
spring aop使用的动态代理机制,就是JDK的动态代理机制和CGLIG的动态代理机制。
CGLIB 创建的代理类的性能要优于jdk动态代理机制创建的代理类, 但CGLIB创建动态代理的过程要慢于jdk。
3. Spring AOP的5中增强接口
1. 前置增强:org.springframework.aop.MethodBeforeAdvice
2.后置增强:org.springframework.aop.AfterReturningAdvice
3. 环绕增强:org.aopalliance.intercept.MethodInterceptor
4.异常抛出增强:org.springframework.aop.ThrowsAdvice
5. 引介增强:org.springframework.aop.IntroductionInterceptor 可以在目标类中增加方法或者属性
4. Spring AOP中的一些重要的类
public interface AopProxy{
Object getProxy();
Object getProxy(ClassLoader classLoader);
}
final class JdkDynamicAopProxy implements AopProxy, InvocationHandler....... // 使用JDK的动态代理实现
class CglibAopProxy implements AopProxy...... // 使用CGlib实现