Spring Aop 思维导图
2023-01-09 17:16:11 24 举报
AI智能生成
Spring Aop 思维导图
作者其他创作
大纲/内容
Aop 概念
Aspect:表示切面,比如被@Aspect注解的类就是切面,可以在切面中去定义Pointcut、Advice等等
Join point:表示连接点,表示一个程序在执行过程中的一个点,比如一个方法的执行,比如一个异常的处理,在Spring AOP中,一个连接点通常表示一个方法的执行。
Advice:表示通知,表示在一个特定连接点上所采取的动作。Advice分为不同的类型,后面详细讨论,在很多AOP框架中,包括Spring,会用Interceptor拦截器来实现Advice,并且在连接点周围维护一个Interceptor链
Pointcut:表示切点,用来匹配一个或多个连接点,Advice与切点表达式是关联在一起的,Advice将会执行在和切点表达式所匹配的连接点上
Introduction:可以使用@DeclareParents来给所匹配的类添加一个接口,并指定一个默认实现
Target object:目标对象,被代理对象
AOP proxy:表示代理工厂,用来创建代理对象的,在Spring Framework中,要么是JDK动态代理,要么是CGLIB代理
Weaving:表示织入,表示创建代理对象的动作,这个动作可以发生在编译时期(比如Aspejctj),或者运行时,比如Spring AOP
创建代理对象的方式
ProxyFactoryBean
只能针对某一个Bean。它是一个FactoryBean
BeanNameAutoProxyCreator
通过指定某个bean的名字,来对该bean进行代理
DefaultAdvisorAutoProxyCreator
直接去找所有Advisor类型的Bean,根据Advisor中的PointCut和Advice信息,确定要代理的Bean以及代理逻辑
spring Aop 对应
@Before:AspectJMethodBeforeAdvice,实际上就是一个MethodBeforeAdvice
@AfterReturning:AspectJAfterReturningAdvice,实际上就是一个AfterReturningAdvice
@AfterThrowing:AspectJAfterThrowingAdvice,实际上就是一个MethodInterceptor
@After:AspectJAfterAdvice,实际上就是一个MethodInterceptor
@Around:AspectJAroundAdvice,实际上就是一个MethodInterceptor
动态代理选择
ObjenesisCglibAopProxy
选择时机
通常来说是 proxyTargetClass为true
只实现了SpringProxy这个接口
代理类没有实现接口
代理对象创建过程
创建Enhancer对象
设置Enhancer的superClass为通过ProxyFactory.setTarget()所设置的对象的类
设置Enhancer的interfaces为通过ProxyFactory.addInterface()所添加的接口,以及SpringProxy、Advised、DecoratingProxy接口
设置Enhancer的Callbacks为DynamicAdvisedInterceptor
最后创建一个代理对象,代理对象在执行某个方法时,会进入到DynamicAdvisedInterceptor的intercept()方法中
JdkDynamicAopProxy
选择时机
当代理对象是接口时肯定是 jdk 代理
当没有设置为 cglib 时
代理对象创建过程
在构造JdkDynamicAopProxy对象时,会先拿到被代理对象自己所实现的接口,并且额外的增加SpringProxy、Advised、DecoratingProxy三个接口,组合成一个Class[],并赋值给proxiedInterfaces属性
执行Proxy.newProxyInstance(classLoader, this.proxiedInterfaces, this),JdkDynamicAopProxy作为InvocationHandler,代理对象在执行某个方法时, invoke() 方法中
代理对象执行过程
在使用ProxyFactory创建代理对象之前,需要往ProxyFactory先添加Advisor
代理对象在执行某个方法时,会把ProxyFactory中的Advisor拿出来和当前正在执行的方法进行匹配筛选
把和方法所匹配的Advisor适配成MethodInterceptor
把和当前方法匹配的MethodInterceptor链,以及被代理对象、代理对象、代理类、当前Method对象、方法参数封装为MethodInvocation对象
调用MethodInvocation的proceed()方法,开始执行各个MethodInterceptor以及被代理对象的对应方法
按顺序调用每个MethodInterceptor的invoke()方法,并且会把MethodInvocation对象传入invoke()方法
直到执行完最后一个MethodInterceptor了,就会调用invokeJoinpoint()方法,从而执行被代理对象的当前方法
AOP 加载流程
Bean 初始化后
调用 AbstractAutoProxyCreator#postProcessAfterInitialization
wrapIfNecessary
getAdvicesAndAdvisorsForBean 获取所有的advisor
会在第一次查找的时候缓存一下beanName
直接创建代理队对象
0 条评论
下一页