美文网首页
spring-aop

spring-aop

作者: 码农崛起 | 来源:发表于2018-05-08 01:34 被阅读0次

    1, aop的两种实现机制
    动态代理:利用jdk/cglib动态代理,性能弱一丢丢

    jdk.png

    jdk动态代理:所有的方法调用被jvm拦截,然后路由到代理类的invoke方法,invoke方法再委托给target。

    cglib.png

    cglib动态代理:动态生成target的子类的字节码,然后把方法调用委托给target里的相同方法。

    静态织入:编译时修改字节码,每次修改aop相关都要重新编译

    2,Pointcut

    Pointcut.png

    Pointcut表示切点,表示要拦截哪些类的哪些方法。

    AnnotationMatchingPointcut:匹配类或/和方法上有指定注解
    AspectJExpressionPointcut:基于AspectJ切点表达式匹配
    ComposablePointcut:组合切点
    ControlFlowPointcut:控制流切点,比其他切点慢10-15倍
    DynamicMethodMatcherPointcut:
    StaticMethodMatcherPointcut:
    JdkRegexpMethodPointcut:
    NameMatchMethodPointcut:

    3, Advice

    Advice.png

    Advice表示通知,表示要执行的行为

    MethodInterceptor:环绕通知,在被拦截的方法执行之前和之后执行
    ConstructorInterceptor:拦截实例化
    MethodBeforeAdvice:被拦截方法执行之前执行,不能阻止被拦截方法的执行,除非抛出异常。
    IntroductionInterceptor:动态实现接口
    AfterReturningAdvice:被拦截方法执行之后执行,被拦截方法抛出异常不执行,能看到被拦截方法返回值,但是不能修改
    ThrowsAdvice:标记接口,被拦截方法抛出异常时执行,通过反射执行void afterThrowing([Method, args, target], ThrowableSubclass)方法

    4, Advisor

    Advisor.png

    Advisor表示切面,是切点和通知的组合

    PointcutAdvisor:基于切点的切面,切点和通知的组合
    IntroductionAdvisor:满足条件的类利用IntroductionInterceptor实现指定接口

    5, ProxyFactory

    ProxyFactory.png

    根据切面和target生成动态代理。

    动态代理.png

    设置优化,代理目标类,没有提供代理接口时使用cglib代理。

    jdk-proxy-1.png jdk-proxy-2.png

    jdk动态代理:invoke方法中把方法调用都通过反射调用target的对应方法

    生成字节码.png 实例化.png

    cglib动态生成字节码然后实例化

    6, ProxyFactoryBean
    继承ProxyCreatorSupport,设置各种代理相关参数。实现FactoryBean<Object>, BeanClassLoaderAware, BeanFactoryAware接口

    getObject.png getSingletonInstance.png newPrototypeInstance.png

    7, InstantiationAwareBeanPostProcessor

    InstantiationAwareBeanPostProcessor.png

    利用InstantiationAwareBeanPostProcessor拦截bean实例的构造,如果bean被注解或xml等配置的advisor拦截到,不再使用构造方法,返回动态生成的代理。

    屏幕快照 2018-05-08 下午6.42.14.png 屏幕快照 2018-05-08 下午6.42.35.png

    相关文章

      网友评论

          本文标题:spring-aop

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