Spring Aop源码提问--getCustomTargetSource

AbstractAutoProxyCreator类的postProcessBeforeInstantiation

  
@Override  
public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException {  
   Object cacheKey = getCacheKey(beanClass, beanName);  
  
   if (beanName == null || !this.targetSourcedBeans.contains(beanName)) {  
      if (this.advisedBeans.containsKey(cacheKey)) {  
         return null;  
      }  
      if (isInfrastructureClass(beanClass) || shouldSkip(beanClass, beanName)) {  
         this.advisedBeans.put(cacheKey, Boolean.FALSE);  
         return null;  
      }  
   }  
  
   // Create proxy here if we have a custom TargetSource.  
 // Suppresses unnecessary default instantiation of the target bean: // The TargetSource will handle target instances in a custom fashion.  
 if (beanName != null) {  
      TargetSource targetSource = getCustomTargetSource(beanClass, beanName);  
      if (targetSource != null) {  
         this.targetSourcedBeans.add(beanName);  
         Object\[\] specificInterceptors = getAdvicesAndAdvisorsForBean(beanClass, beanName, targetSource);  
         Object proxy = createProxy(beanClass, beanName, specificInterceptors, targetSource);  
         this.proxyTypes.put(cacheKey, proxy.getClass());  
         return proxy;  
      }  
   }  
  
   return null;  
}
protected TargetSource getCustomTargetSource(Class<?> beanClass, String beanName) {  
   // We can't create fancy target sources for directly registered singletons.  
  if (this.customTargetSourceCreators != null &&  
         this.beanFactory != null && this.beanFactory.containsBean(beanName)) {  
      for (TargetSourceCreator tsc : this.customTargetSourceCreators) {  
         TargetSource ts = tsc.getTargetSource(beanClass, beanName);  
         if (ts != null) {  
            // Found a matching TargetSource.  
  if (logger.isDebugEnabled()) {  
               logger.debug("TargetSourceCreator \[" \+ tsc +  
                     " found custom TargetSource for bean with name '" \+ beanName + "'");  
            }  
            return ts;  
         }  
      }  
   }  
  
   // No custom TargetSource found.  
  return null;  
}

问题:

TargetSource targetSource = getCustomTargetSource(beanClass, beanName);  

这行代码的作用是什么? 什么情况下发挥作用?

阅读 4.2k
1 个回答

这是自定义 TargetSource,配置类似:

image

如果用户自定义了这个配置,那么会在真实类被spring实例化前根据自定义配置类生成代理类,再执行bean后置处理器后置处理方法,然后直接返回;就不会走spring通过构造方法初始化bean了
看这个方法就对了:
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])

image

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题