-
BeanFactoryAspectJAdvisorsBuilder:用于从BeanFactory检索@AspectJ bean并基于它们构建Spring Advisor的帮助程序,以与自动代理一起使用。
- buildAspectJAdvisors:在当前的bean工厂中查找带有Aspect注释的aspect bean,然后返回代表它们的Spring AOP Advisor列表。
- 先获取到aspectBeanNames,如果为空,则去寻找带有@Aspect注解的bean。
- 寻找到带@Aspect的bean后会根据beanType和beanName实例化一个AspectMetadata。(在单例bean的情况下):之后再实例化一个MetadataAwareAspectInstanceFactory,再通过将此factory作为参数调用this.advisorFactory.getAdvisors(factory)
- 此步骤会获取到切面类中带有前切后切环切等的方法。
- 通过这些方法实例化Advisor(InstantiationModelAwarePointcutAdvisorImpl),然后将实例化好的Advisor存放到List中。
- buildAspectJAdvisors:在当前的bean工厂中查找带有Aspect注释的aspect bean,然后返回代表它们的Spring AOP Advisor列表。
-
给bean应用BeanPostProcessor的postProcessAfterInitialization时,调用AbstractAutoProxyCreator的postProcessAfterInitialization,然后调用wrapIfNecessary来包装bean。
-
Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
- 先寻找到所有的Advisors,然后寻找可以应用给该bean的Advisors。
- 首先获取到此Advisor的ClassFilter来与目标类进行匹配,匹配失败则返回false。
- 判断是否需要匹配所有方法,是则返回true。
- 通过IntroductionAwareMethodMatcher进行方法匹配,成功匹配到一个方法则返回true。
- 为Advisors链添加一个ExposeInvocationInterceptor作为头部。
- 将所有的Advisor封装成PartiallyComparableAdvisorHolder进行排序。
- 先寻找到所有的Advisors,然后寻找可以应用给该bean的Advisors。
-
创建代理对象:
- buildAdvisors
- 获取到通用拦截器。
- 将specificInterceptors和commonInterceptors合在一起。
- 将所有的Interceptors适配后返回。
- 给proxyFactory设置Advisors和TargetSource和Frozen。
- createAopProxy,cglib是ObjenesisCglibAopProxy,jdk动态代理是JdkDynamicAopProxy。然后再通过创建出来的AopProxy来getProxy就生成了代理对象。
- buildAdvisors
-
使用代理对象的方法:
-
调用DynamicAdvisedInterceptor的intercept。
- 获取到代理对象代理的目标对象,获取与拦截方法相匹配的InterceptorsAndDynamicInterceptionAdvice。是一条拦截器链,会对拦截器链进行递归调用,直到尾部。也就是调用切面的方法。
-
执行顺序(多个切面可以用@Order排序,每个切面中的方法按以下顺序执行)
-
环绕:
-
Before:
-
After:
-
AfterReturning:
-
AfterThrowing:
-
-
SpringAop具体流程
最新推荐文章于 2024-10-19 14:41:34 发布