spring-aop

2018-05-08  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读