spring-aop

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

spring-aop_第1张图片
jdk.png

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

spring-aop_第2张图片
cglib.png

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

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

2,Pointcut

spring-aop_第3张图片
Pointcut.png

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

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

3, Advice

spring-aop_第4张图片
Advice.png

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

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

4, Advisor

spring-aop_第5张图片
Advisor.png

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

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

5, ProxyFactory

spring-aop_第6张图片
ProxyFactory.png

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

spring-aop_第7张图片
动态代理.png

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

spring-aop_第8张图片
jdk-proxy-1.png
spring-aop_第9张图片
jdk-proxy-2.png

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

spring-aop_第10张图片
生成字节码.png
spring-aop_第11张图片
实例化.png

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

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

spring-aop_第12张图片
getObject.png
spring-aop_第13张图片
getSingletonInstance.png
spring-aop_第14张图片
newPrototypeInstance.png

7, InstantiationAwareBeanPostProcessor

spring-aop_第15张图片
InstantiationAwareBeanPostProcessor.png

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

spring-aop_第16张图片
屏幕快照 2018-05-08 下午6.42.14.png
spring-aop_第17张图片
屏幕快照 2018-05-08 下午6.42.35.png

你可能感兴趣的:(spring-aop)