1, aop的两种实现机制
动态代理:利用jdk/cglib动态代理,性能弱一丢丢
jdk动态代理:所有的方法调用被jvm拦截,然后路由到代理类的invoke方法,invoke方法再委托给target。
cglib动态代理:动态生成target的子类的字节码,然后把方法调用委托给target里的相同方法。
静态织入:编译时修改字节码,每次修改aop相关都要重新编译
2,Pointcut
Pointcut表示切点,表示要拦截哪些类的哪些方法。
AnnotationMatchingPointcut:匹配类或/和方法上有指定注解
AspectJExpressionPointcut:基于AspectJ切点表达式匹配
ComposablePointcut:组合切点
ControlFlowPointcut:控制流切点,比其他切点慢10-15倍
DynamicMethodMatcherPointcut:
StaticMethodMatcherPointcut:
JdkRegexpMethodPointcut:
NameMatchMethodPointcut:
3, Advice
Advice表示通知,表示要执行的行为
MethodInterceptor:环绕通知,在被拦截的方法执行之前和之后执行
ConstructorInterceptor:拦截实例化
MethodBeforeAdvice:被拦截方法执行之前执行,不能阻止被拦截方法的执行,除非抛出异常。
IntroductionInterceptor:动态实现接口
AfterReturningAdvice:被拦截方法执行之后执行,被拦截方法抛出异常不执行,能看到被拦截方法返回值,但是不能修改
ThrowsAdvice:标记接口,被拦截方法抛出异常时执行,通过反射执行void afterThrowing([Method, args, target], ThrowableSubclass)方法
4, Advisor
Advisor表示切面,是切点和通知的组合
PointcutAdvisor:基于切点的切面,切点和通知的组合
IntroductionAdvisor:满足条件的类利用IntroductionInterceptor实现指定接口
5, ProxyFactory
根据切面和target生成动态代理。
设置优化,代理目标类,没有提供代理接口时使用cglib代理。
jdk动态代理:invoke方法中把方法调用都通过反射调用target的对应方法
cglib动态生成字节码然后实例化
6, ProxyFactoryBean
继承ProxyCreatorSupport,设置各种代理相关参数。实现FactoryBean<Object>, BeanClassLoaderAware, BeanFactoryAware接口
7, InstantiationAwareBeanPostProcessor
利用InstantiationAwareBeanPostProcessor拦截bean实例的构造,如果bean被注解或xml等配置的advisor拦截到,不再使用构造方法,返回动态生成的代理。