返回介绍

7.3 创建 AOP 代理

发布于 2025-04-22 22:09:13 字数 3685 浏览 0 评论 0 收藏

上文中讲解了通过自定义配置完成了对 AnnotationAwareAspectJAutoProxyCreator 类型的自动注册,那么这个类到底做了什么工作来完成 AOP 的操作呢?首先我们看看 Annotation AwareAspectJAutoProxyCreator 类的层次结构,如图 7-1 所示。

figure_0184_0036

图 7-1 AnnotationAwareAspectJAutoProxyCreator 类的层次结构图

在类的层级中,我们看到 AnnotationAwareAspectJAutoProxyCreator 实现了 BeanPostProcessor 接口,而实现 BeanPostProcessor 后,当 Spring 加载这个 Bean 时会在实例化前调用其 postProcess AfterInitialization 方法,而我们对于 AOP 逻辑的分析也由此开始。

在父类 AbstractAutoProxyCreator 的 postProcessAfterInitialization 中代码如下:

public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {

  if (bean != null) {

  //根据给定的 bean 的 class 和 name 构建出个 key,格式:beanClassName_beanName

   Object cacheKey = getCacheKey(bean.getClass(), beanName);

   if (!this.earlyProxyReferences.contains(cacheKey)) {

  //如果它适合被代理,则需要封装指定 bean。

    return wrapIfNecessary(bean, beanName, cacheKey);

  }

 }

  return bean;

}

protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {

 //如果已经 处理过

  if (this.targetSourcedBeans.contains(beanName)) {

   return bean;

 }

 //无需增强

  if (this.nonAdvisedBeans.contains(cacheKey)) {

   return bean;

 }

//给定的 bean 类是否代表一个基础设施类,基础设施类不应代理,或者配置了指定 bean 不需要自动代理

  if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(),

  beanName)) {

  this.nonAdvisedBeans.add(cacheKey);

   return bean;

 }

 //如果存在增强方法则创建代理

  Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(),

  beanName, null);

 //如果获取到了增强则需要针对增强创建代理

  if (specificInterceptors != DO_NOT_PROXY) {

  this.advisedBeans.add(cacheKey);

  //创建代理

  Object proxy = createProxy(bean.getClass(), beanName, specificInterceptors,

  new SingletonTargetSource(bean));

   this.proxyTypes.put(cacheKey, proxy.getClass());

   return proxy;

 }

 this.nonAdvisedBeans.add(cacheKey);

  return bean;

}

函数中我们已经看到了代理创建的雏形。当然,真正开始之前还需要经过一些判断,比如是否已经处理过或者是否是需要跳过的 bean,而真正创建代理的代码是从 getAdvicesAnd AdvisorsForBean 开始的。

创建代理主要包含了两个步骤:

(1)获取增强方法或者增强器;

(2)根据获取的增强进行代理。

核心逻辑的时序图如图 7-2 所示。

figure_0185_0037

图 7-2 AbstractAutoProxyCreator 的 postProcessAfterInitialization 函数执行时序图

虽然看似简单,但是每个步骤中都经历了大量复杂的逻辑。首先来看看获取增强方法的实现逻辑。

@Override

protected Object[] getAdvicesAndAdvisorsForBean(Class beanClass, String beanName,

TargetSource targetSource) {

  List advisors = findEligibleAdvisors(beanClass, beanName);

  if (advisors.isEmpty()) {

   return DO_NOT_PROXY;

 }

  return advisors.toArray();

}

protected List<Advisor> findEligibleAdvisors(Class beanClass, String beanName) {

  List<Advisor> candidateAdvisors = findCandidateAdvisors();

  List<Advisor> eligibleAdvisors = findAdvisorsThatCanApply(candidateAdvisors,

  beanClass, beanName);

 extendAdvisors(eligibleAdvisors);

  if (!eligibleAdvisors.isEmpty()) {

   eligibleAdvisors = sortAdvisors(eligibleAdvisors);

 }

  return eligibleAdvisors;

}

对于指定 bean 的增强方法的获取一定是包含两个步骤的,获取所有的增强以及寻找所有增强中适用于 bean 的增强并应用,那么 findCandidateAdvisors 与 findAdvisorsThatCanApply 便是做了这两件事情。当然,如果无法找到对应的增强器便返回 DO_NOT_PROXY,其中 DO_NOT_PROXY=null。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。