美文网首页
spring-aop认识

spring-aop认识

作者: 想做安徒生 | 来源:发表于2018-06-22 20:43 被阅读0次

    基础前瞻
    两种动态代理对比:

    1.JDK 动态代理:基于接口,只能为接口创建实现动态代理,通过调用目标类实现。

    2.CGLib动态代理:基于字节码,创建子类的形式,拦截所有父类的调用。

    对比来看:频繁创建类的场景,CGLib效率要比JDK低,而从执行效率的角度,CGlib要比JDK高。

    Spring使用原生的动态代理机制虽然可以实现AOP,但是依然有不足的地方:

    (1)范围太大,不灵活--目标类所有方法都被动态代理:

    (2)织入点扩展不方便—依赖硬编码的形式编写植入点代码

    (3)手动创建代理类,代码重复率高,不通用。

    Spring的改进:

    (1)Pointcut指定织入横切范围

    (2)Advice(增强),描述横切逻辑和织入点(方法前 方法后 方法两端)

    (3)Avisor(切面)组织 切点 和 增强

    Spring扩展增强接口

    (1)MethodBeforeAdvice:前置增强 @Before

    (2)AfterReturningAdvice:后置增强 @AfterReturning

    (3)MethodInterceptor:环绕增强 @Around

    (4)ThrowsAdvice:异常增强,适用于事务管理—标签接口 @AfterThrowing

    (5)引介增强:类级别的 @DeclareParent

    (6)@After 一般用于释放资源

    在Spring 的AOP中,如果一个Proxy同时实现MethodBeforeAdvice、AfterReturningAdvice和MethodInterceptor接口,那么这三个Advice的执行顺序是什么样的呢?
    经过试验,是和xml文件中的定义顺序有关的。
    如果Proxy的接口实现定义为 MethodBeforeAdvice、AfterReturningAdvice、MethodInterceptor
    那么执行的结果是
    MethodBeforeAdvice
    MethodInterceptor: before call
    Really method excuting
    MethodInterceptor: after call
    AfterReturningAdvice

    Spring 切面:

    (1)静态切面

    image.png image.png

    (2)动态切面

    image.png

    Spring自动创建代理

    (1)基于Bean配置名规则创建器:BeanNameAutoProxyCreator

    image.png

    (2)基于Advisor匹配机制的创建器:DefaultAdvisorAutoProxyCreator

    image.png

    (3)基于Bean的AspectJ注解标签的创建器:AnnotionAwareAspectJAutoProxyCreator

    AspectJ是采用注解的形式描述切点、增强
    

    spring配置

    image.png

    Schema 配置

    image.png

    AOP无法增强的案例问题:

    (1)内部方法之间的调用无法被增强:

    访问连接点信息

    image.png image.png

    相关文章

      网友评论

          本文标题:spring-aop认识

          本文链接:https://www.haomeiwen.com/subject/hnjlyftx.html