• (spring-第18回【AOP基础篇】) 创建切面


    一、   在创建增强一节中,增强被织入到目标类的所有方法中,假设我们希望有选择地织入到目标类某些特定的方法中,就需要使用切点进行目标连接点的定位。

    二、   spring通过org.springframework.aop.Pointcut接口描述切点。PointCut由ClassFilter和MethodMatcher构成,前者定位类,后者定位特定方法。

    三、   Spring支持静态方法匹配器和动态方法匹配器。

    a)   静态:仅对方法签名进行匹配,而且只会判别一次。
    b)   动态:在运行期检查方法入参的值。因为每次调用方法时入参可能会不一样,所以每次都需要判断,影响了性能,动态匹配不常用。

    四、   切点类型(插入的具体位置)(每种类型都会有一个抽象基类)

    a)   静态方法切点
    b)   动态方法切点
    c)   注解切点
    d)   表达式切点
    e)   流程切点
    f)   复合切点

    五、   切面类型(插入的具体位置+被插入的代码)

    a)   spring通过org.springframework.aop.Advisor接口表示切面,一个切面同时包括横切代码和连接点信息。
    b)   切面分为三类:
      1. 一般切面Advisor,它代表的横切的连接点是所有目标类的所有方法。
      2. PointcutAdvisor:代表具有切点的切面。
      3. IntroductionAdvisor:代表引介切面。

    六、   举例

    a)   静态普通方法名匹配切面:

    第一步,定义目标类(我们想要给Waiter类的greetTo方法之前打印一句友好的话)

    第二步,通过继承PointcutAdvisor的实现类来过滤方法和类(定义切面)

    (第一个方法定位目标类的目标方法,即greetTo,第二个方法定位目标类,即Waiter)

    第三步,定义增强类(前置增强,获取方法名,即greetTo,打印类名、方法名,然后打印友好的话。)

    第四步,把切面、增强、目标类交织起来。

    b)   静态正则表达式方法匹配切面
    1. 已有的功能齐备实现类:StaticMethodMatcherPointcutAdvisor。
    2. 无需扩展上述类来定义切面,直接在XML中配置即可。
    3. 比静态匹配多了正则匹配的功能,在配置中写正则方法。
    c)   动态切面

    比静态匹配多了动态匹配。也就是说,在定义切面的实现类中,除了方法检查和类检查外,多了个动态切点检查的方法。

    七、   自动创建代理

    a)   之前讲过的方法中,每次到最后一步都需要通过ProxyFactory来交织增强,切面和目标类(或者在XML中通过ProxyFactoryBean来配置)。spring通过BeanPostProcessor可以自动的完成这项工作。

    1. BeanNameAutoProxyCreator允许为一组特定配置名的Bean自动创建代理实例。
    2. DefaultAdvisorAutoProxyCreator:对容器中所有的Advisor进行扫描,自动将这些切面应用到匹配的Bean中。
    3. AnnotationAwareAspectJAutoProxyCreator,为包含AspectJ注解的Bean自动创建代理实例。
  • 相关阅读:
    PHP_Code_challenge(代码审计)
    超全局变量$GLOBALS
    upload-labs(文件上传)
    CTF bugku 论剑场 web20
    多次Printf()是否使用用同一栈帧的参数?
    (转载于度盘)小迪安全渗透-学习讲义
    SQL数据库操作练习(2)
    .htaccess绕过
    PHP序列化思考(9.14已修改)
    SQL数据库操作练习(1)
  • 原文地址:https://www.cnblogs.com/mesopotamia/p/5520723.html
Copyright © 2020-2023  润新知