zoukankan      html  css  js  c++  java
  • SpringBean加载过程中,循环依赖的问题(二)


    参考代码
    在上一篇章中,我们分析了循环依赖普通Bean加载的过程,知道了是依靠字段注入和三级缓存解决的循环依赖问题。接下来我们猜测一下如果Bean是动态代理Bean,是如何解决循环依赖问题的?
    首先假设A是动态代理类、B是普通Bean,A依赖B、B依赖A,在第一次getBean()的过程中,A在执行pupupateBean方法之前,已经将实例化的对象放入到了三级缓存中,而后正执行populateBean的过程中,需要注入依赖对象B,然后开始加载对象B,
    而后B在加载的过程中,实例化之后放入三级缓存,而后在populateBean的过程中,发现对对象A的依赖,此时循环去加载对象A,此时A对象在三级缓存中,所以从三级缓存中获取,在三级缓存获取的过程中,实现了动态代理后置处理器getEarlyBeanReference对对象A的处理,对象A生成了代理对象,并添加到二级缓存中,同时返回到B对象的字段注入过程中,B对象执行完populateBean的方法,开始执行inintailizeBean过程,在inintailizeBean的过程中,再次执行了动态代理后置处理器的postProcessAfterInstantiation方法,此时B对象不需要动态代理,返回到doCreateBean的方法中,当调用getSingleton方法从三级缓存(概念)中获取时,二级缓存中没有对象,又执行不到三级缓存处(singletonFactories),所以返回null,随后返回到getSingleton(String beanName, ObjectFactory<?> singletonFactory)方法中,去除正在创建的标记,并添加到一级缓存中。

    此时返回到A对象的populateBean的过程中,执行完popoulateBean方法,执行inintailizeBean方法,方法中执行了动态代理后置处理器的postProcessAfterInstantiation方法时,发现A对象已在三级缓存过程中被处理,不再进行处理,执行完initializeBean方法,返回到doCreateBean方法中,执行从三级缓存(概念)中获取对象,拿到了二级缓存中的代理对象,此时将代理对象赋值给A变量,解决动态代理情况下的循环依赖。

    三级缓存的功能:
    三级缓存:缓存返回实例化对象的lambda方法,返回过程中可以对对象进行代理处理
    二级缓存:缓存实例化对象或需要被代理的代理对象。
    一级缓存:缓存已经生成好的初始化对象;

    getBean

    resolveBeforeInstantiation

    首先在createBean()时,调用了resolveBeforeInstantiation的方法,给Bean后置处理器一个返回代理目标类代理类的机会。在此调用的是后置处理器的postProcessBeforeInstantiation
    getBeanPostProcessorCache().instantiationAware包括InstantiationAwareBeanPostProcessor 有:

    0 = {ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor@6040} 
    1 = {AnnotationAwareAspectJAutoProxyCreator@6041} "proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false"
    2 = {CommonAnnotationBeanPostProcessor@6042} 
    3 = {AutowiredAnnotationBeanPostProcessor@6043} 
    

    经过后置处理器的postProcessBeforeInstantiation方法处理之后,调用doCreateBean方法

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    	@Override
    	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    			throws BeanCreationException {
    		try {
    			// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
    			Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
    			if (bean != null) {
    				return bean;
    			}
    		}
    		try {
    			Object beanInstance = doCreateBean(beanName, mbdToUse, args);
    			if (logger.isTraceEnabled()) {
    				logger.trace("Finished creating instance of bean '" + beanName + "'");
    			}
    			return beanInstance;
    		}
    
      }
    
    	@Nullable
    	protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
    		Object bean = null;
    		if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
    			// Make sure bean class is actually resolved at this point.
    			if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    				Class<?> targetType = determineTargetType(beanName, mbd);
    				if (targetType != null) {
    					bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
    					if (bean != null) {
    						//如果Bean不为空,则直接执行后置处理器的postProcessBeforeInstantiation方法,此时
    						//获取后置处理器调用的是BeanPostProcessor processor : getBeanPostProcessors()方法,返回所有的后置处理器
    						bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
    					}
    				}
    			}
    			mbd.beforeInstantiationResolved = (bean != null);
    		}
    		return bean;
    	}
    
    
    	@Nullable
    	protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
    		for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
    			Object result = bp.postProcessBeforeInstantiation(beanClass, beanName);
    			if (result != null) {
    				return result;
    			}
    		}
    		return null;
    	}
    }
    

    AnnotationAwareAspectJAutoProxyCreator

    在调用AnnotationAwareAspectJAutoProxyCreator的postProcessBeforeInstantiation时,调用的实际是父类AbstractAutoProxyCreator的方法,此时逻辑返回null

    public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
    		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
    	//建议Bean缓存,基础代理类型Bean:Advice、Pointcut、Advisor或AspectJ注解修饰的bean
    	private final Map<Object, Boolean> advisedBeans = new ConcurrentHashMap<>(256);
    	@Override
    	public Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) {
    		Object cacheKey = getCacheKey(beanClass, beanName);
    
    		if (!StringUtils.hasLength(beanName) || !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.
      		//如果有一个自定义源目标,则创建一个代理类
    		TargetSource targetSource = getCustomTargetSource(beanClass, beanName);
    		if (targetSource != null) {
    			if (StringUtils.hasLength(beanName)) {
    				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;
    	}
    }
    

    doCreateBean

    首先调用createBeanInstance创建实例,使用的instantiateBean(beanName, mbd)返回实例对象,调用applyMergedBeanDefinitionPostProcessors合并beanDefinition后置处理器,然后将实例对象添加到三级缓存中,调用populateBean方法,执行完populate之后,继续执行initializeBean,

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    
    	protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args)
    			throws BeanCreationException {
    
    		// Instantiate the bean.
    		BeanWrapper instanceWrapper = null;
    		if (mbd.isSingleton()) {
    			instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
    		}
    		if (instanceWrapper == null) {
    			//使用instantiateBean(beanName, mbd)返回实例对象
    			instanceWrapper = createBeanInstance(beanName, mbd, args);
    		}
    		Object bean = instanceWrapper.getWrappedInstance();
    		Class<?> beanType = instanceWrapper.getWrappedClass();
    		if (beanType != NullBean.class) {
    			mbd.resolvedTargetType = beanType;
    		}
    
    		// Allow post-processors to modify the merged bean definition.
    		synchronized (mbd.postProcessingLock) {
    			if (!mbd.postProcessed) {
    				try {
    					//合并beanDefinition后置处理器
    					applyMergedBeanDefinitionPostProcessors(mbd, beanType, beanName);
    				}
    				catch (Throwable ex) {
    					throw new BeanCreationException(mbd.getResourceDescription(), beanName,
    							"Post-processing of merged bean definition failed", ex);
    				}
    				mbd.postProcessed = true;
    			}
    		}
    
    		// Eagerly cache singletons to be able to resolve circular references
    		// even when triggered by lifecycle interfaces like BeanFactoryAware.
    		boolean earlySingletonExposure = (mbd.isSingleton() && this.allowCircularReferences &&
    				isSingletonCurrentlyInCreation(beanName));
    		if (earlySingletonExposure) {
    			if (logger.isTraceEnabled()) {
    				logger.trace("Eagerly caching bean '" + beanName +
    						"' to allow for resolving potential circular references");
    			}
    			addSingletonFactory(beanName, () -> getEarlyBeanReference(beanName, mbd, bean));
    		}
    
    		// Initialize the bean instance.
    		Object exposedObject = bean;
    		try {
    			populateBean(beanName, mbd, instanceWrapper);
    			exposedObject = initializeBean(beanName, exposedObject, mbd);
    		}
    		catch (Throwable ex) {
    			if (ex instanceof BeanCreationException && beanName.equals(((BeanCreationException) ex).getBeanName())) {
    				throw (BeanCreationException) ex;
    			}
    			else {
    				throw new BeanCreationException(
    						mbd.getResourceDescription(), beanName, "Initialization of bean failed", ex);
    			}
    		}
    
    		if (earlySingletonExposure) {
    			Object earlySingletonReference = getSingleton(beanName, false);
    			if (earlySingletonReference != null) {
    				if (exposedObject == bean) {
    					exposedObject = earlySingletonReference;
    				}
    				else if (!this.allowRawInjectionDespiteWrapping && hasDependentBean(beanName)) {
    					String[] dependentBeans = getDependentBeans(beanName);
    					Set<String> actualDependentBeans = new LinkedHashSet<>(dependentBeans.length);
    					for (String dependentBean : dependentBeans) {
    						if (!removeSingletonIfCreatedForTypeCheckOnly(dependentBean)) {
    							actualDependentBeans.add(dependentBean);
    						}
    					}
    					if (!actualDependentBeans.isEmpty()) {
    						throw new BeanCurrentlyInCreationException(beanName,
    								"");
    					}
    				}
    			}
    		}
    
    		// Register bean as disposable.
    		try {
    			registerDisposableBeanIfNecessary(beanName, bean, mbd);
    		}
    		catch (BeanDefinitionValidationException ex) {
    			throw new BeanCreationException(
    					mbd.getResourceDescription(), beanName, "Invalid destruction signature", ex);
    		}
    
    		return exposedObject;
    	}
    }
    

    populateBean

    在执行bp.postProcessAfterInstantiation方法的时候获取InstantiationAwareBeanPostProcessor,
    InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware:

    0 = {ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor@5858} 
    1 = {AnnotationAwareAspectJAutoProxyCreator@5859} "proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false"
    2 = {CommonAnnotationBeanPostProcessor@5860} 
    3 = {AutowiredAnnotationBeanPostProcessor@5861} 
    

    并且执行postProcessAfterInstantiation,默认都返回InstantiationAwareBeanPostProcessor的postProcessAfterInstantiation方法的执行结果,true;
    执行完实例化后置处理方法之后,继续向下执行。再获取完PropertyValues 之后,开始调用InstantiationAwareBeanPostProcessor的postProcessProperties方法,此时只有CommonAnnotationBeanPostProcessor是有效处理逻辑,开始UserServiceImpl字段的注入,同时从三级缓存中获取OrderServiceImpl的实例进行缓存

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    
        protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
    		
    		// Give any InstantiationAwareBeanPostProcessors the opportunity to modify the
    		// state of the bean before properties are set. This can be used, for example,
    		// to support styles of field injection.
    		//执行实例化之后后置处理方法
    		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    			for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
    				if (!bp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
    					return;
    				}
    			}
    		}
    
    		PropertyValues pvs = (mbd.hasPropertyValues() ? mbd.getPropertyValues() : null);
    
    		int resolvedAutowireMode = mbd.getResolvedAutowireMode();
    		if (resolvedAutowireMode == AUTOWIRE_BY_NAME || resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
    			MutablePropertyValues newPvs = new MutablePropertyValues(pvs);
    			// Add property values based on autowire by name if applicable.
    			if (resolvedAutowireMode == AUTOWIRE_BY_NAME) {
    				autowireByName(beanName, mbd, bw, newPvs);
    			}
    			// Add property values based on autowire by type if applicable.
    			if (resolvedAutowireMode == AUTOWIRE_BY_TYPE) {
    				autowireByType(beanName, mbd, bw, newPvs);
    			}
    			pvs = newPvs;
    		}
    
    		boolean hasInstAwareBpps = hasInstantiationAwareBeanPostProcessors();
    		boolean needsDepCheck = (mbd.getDependencyCheck() != AbstractBeanDefinition.DEPENDENCY_CHECK_NONE);
    
    		PropertyDescriptor[] filteredPds = null;
    		if (hasInstAwareBpps) {
    			if (pvs == null) {
    				pvs = mbd.getPropertyValues();
    			}
    			for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
    				PropertyValues pvsToUse = bp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
    				if (pvsToUse == null) {
    					if (filteredPds == null) {
    						filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    					}
    					pvsToUse = bp.postProcessPropertyValues(pvs, filteredPds, bw.getWrappedInstance(), beanName);
    					if (pvsToUse == null) {
    						return;
    					}
    				}
    				pvs = pvsToUse;
    			}
    		}
    		if (needsDepCheck) {
    			if (filteredPds == null) {
    				filteredPds = filterPropertyDescriptorsForDependencyCheck(bw, mbd.allowCaching);
    			}
    			checkDependencies(beanName, mbd, filteredPds, pvs);
    		}
    
    		if (pvs != null) {
    			applyPropertyValues(beanName, mbd, bw, pvs);
    		}
    	}
    }
    
    • getEarlyBeanReference
      此时,beanName = orderServiceImpl,首先会调用SmartInstantiationAwareBeanPostProcessor 类型的后置处理器的getEarlyBeanReference对exposedObject 进行处理
      SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware:
    0 = {AnnotationAwareAspectJAutoProxyCreator@5889} "proxyTargetClass=true; optimize=false; opaque=false; exposeProxy=false; frozen=false"
    1 = {AutowiredAnnotationBeanPostProcessor@6245} 
    
    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    	protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    		Object exposedObject = bean;
    		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    			for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
    				exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);
    			}
    		}
    		return exposedObject;
    	}
    
    }
    
    • AnnotationAwareAspectJAutoProxyCreator
      AnnotationAwareAspectJAutoProxyCreator的getEarlyBeanReference将原始对象放到动态代理创造器的早期暴露缓存容器中
    public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
    		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
            private final Map<Object, Object> earlyProxyReferences = new ConcurrentHashMap<>(16);
    
    	public Object getEarlyBeanReference(Object bean, String beanName) {
    		Object cacheKey = getCacheKey(bean.getClass(), beanName);
    		this.earlyProxyReferences.put(cacheKey, bean);
    		return wrapIfNecessary(bean, beanName, cacheKey);
    	}
    
    }
    

    initializeBean

    此处调用了applyBeanPostProcessorsBeforeInitialization、applyBeanPostProcessorsAfterInitialization初始化之前后置处理和初始化之后后置处理,其中初始化之前和初始化之后是以是否调用了invokeInitMethods方法,invokeInitMethods方法内部调用了InitializingBean的afterPropertiesSet方法。在调用applyBeanPostProcessorsAfterInitialization方法时,我们分析一下AbstractAdvisorAutoProxyCreator的处理流程

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    	protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
    		if (System.getSecurityManager() != null) {
    			AccessController.doPrivileged((PrivilegedAction<Object>) () -> {
    				invokeAwareMethods(beanName, bean);
    				return null;
    			}, getAccessControlContext());
    		}
    		else {
    			invokeAwareMethods(beanName, bean);
    		}
    
    		Object wrappedBean = bean;
    		if (mbd == null || !mbd.isSynthetic()) {
    			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
    		}
    
    		try {
    			invokeInitMethods(beanName, wrappedBean, mbd);
    		}
    		catch (Throwable ex) {
    			throw new BeanCreationException(
    					(mbd != null ? mbd.getResourceDescription() : null),
    					beanName, "Invocation of init method failed", ex);
    		}
    		if (mbd == null || !mbd.isSynthetic()) {
    			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
    		}
    
    		return wrappedBean;
    	}
    }
    
    

    三级缓存获取代理对象

    在循环依赖的过程中,当OrderServiceImpl加载依赖UserServiceImpl,而UserServiceImpl在过去过程中又依赖OrderServiceImpl,而此时OrderServiceImpl已经在三级缓存中,在调用三级缓存时,调用了getEarlyBeanReference方法,
    在此方法中,主要是AbstractAdvisorAutoProxyCreator 后置处理器对Bean进行加工处理,判断是否生成代理对象,并添加到代理缓存中,返回对象以后,将代理对象添加到二级缓存中,并去除三级缓存

    public abstract class AbstractAutowireCapableBeanFactory extends AbstractBeanFactory
    		implements AutowireCapableBeanFactory {
    	protected Object getEarlyBeanReference(String beanName, RootBeanDefinition mbd, Object bean) {
    		Object exposedObject = bean;
    		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
    			for (SmartInstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().smartInstantiationAware) {
    				exposedObject = bp.getEarlyBeanReference(exposedObject, beanName);
    			}
    		}
    		return exposedObject;
    	}
    }
    

    OrderServiceImpl在initializeBean方法中,执行postProcessAfterInitialization方法时,AbstractAutoProxyCreator对Bean又进行了一次动态代理处理。

    • AbstractAutoProxyCreator
      此时,从earlyProxyReferences移除的Bean = 传入的Bean,说明已经处理过,所以不再进行包装,返回原Bean
    public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
    		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
    
    	@Override
    	public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
    		if (bean != null) {
    			Object cacheKey = getCacheKey(bean.getClass(), beanName);
    			if (this.earlyProxyReferences.remove(cacheKey) != bean) {
    				return wrapIfNecessary(bean, beanName, cacheKey);
    			}
    		}
    		return bean;
    	}
    }
    

    返回到doCreateBean之后,根据earlySingletonExposure = true,从三级缓存里获取当前对象,此时earlySingletonExposure = false,所以从二级缓存中获取,得到我们在三级缓存获取的时候返回的代理对象,同时赋值给exposeObject对象,此时OrderServiceImpl的代理对象中依赖的UserServiceImpl为空。然后返回到doGetBean,此时返回的代理对象值是不完整的。

    那么代理类中的变量是何时赋值的呢???

    AbstractAdvisorAutoProxyCreator

    applyBeanPostProcessorsAfterInitialization

    首先看一下针对UserServiceImpl的处理过程
    如果早期暴露缓存里面不包含该Bean的缓存,则进行包装。

    public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator {
    
    	@Override
    	protected boolean shouldSkip(Class<?> beanClass, String beanName) {
    		// TODO: Consider optimization by caching the list of the aspect names
    		List<Advisor> candidateAdvisors = findCandidateAdvisors();
    		for (Advisor advisor : candidateAdvisors) {
    			if (advisor instanceof AspectJPointcutAdvisor &&
    					((AspectJPointcutAdvisor) advisor).getAspectName().equals(beanName)) {
    				return true;
    			}
    		}
    		//判断增强类型之后,调用父类的shouldSkip方法
    		return super.shouldSkip(beanClass, beanName);
    	}
    
    }
    

    *AbstractAutoProxyCreator
    shouldSkip方法内部调用AutoProxyUtils自动代理工具类的isOriginalInstance方法;
    调用ProxyFactory的getProxy获取代理类

    public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
    		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
    
    	@Override
    	public Object postProcessAfterInitialization(@Nullable Object bean, String beanName) {
    		if (bean != null) {
    			Object cacheKey = getCacheKey(bean.getClass(), beanName);
    			if (this.earlyProxyReferences.remove(cacheKey) != bean) {
    				return wrapIfNecessary(bean, beanName, cacheKey);
    			}
    		}
    		return bean;
    	}
    
    	protected Object wrapIfNecessary(Object bean, String beanName, Object cacheKey) {
    		//目标对象包含,直接返回原Bean
    		if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
    			return bean;
    		}
    		//advice = false,直接返回
    		if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
    			return bean;
    		}
    		//如果是代理基础类型或应该跳过,添加到不建议缓存列表中,并直接返回
    		if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
    			this.advisedBeans.put(cacheKey, Boolean.FALSE);
    			return bean;
    		}
    
    		// Create proxy if we have advice.
    		//如果有通知,则创建当前类的代理对象,并添加到代理类型缓存容器中
    		Object[] specificInterceptors = getAdvicesAndAdvisorsForBean(bean.getClass(), beanName, null);
    		if (specificInterceptors != DO_NOT_PROXY) {
    			//如果增强数组不为空,则建议增强类表设置为true,并调用createProxy方法,创建代理类
    			this.advisedBeans.put(cacheKey, Boolean.TRUE);
    			Object proxy = createProxy(
    					bean.getClass(), beanName, specificInterceptors, new SingletonTargetSource(bean));
    			this.proxyTypes.put(cacheKey, proxy.getClass());
    			return proxy;
    		}
    
    		this.advisedBeans.put(cacheKey, Boolean.FALSE);
    		return bean;
    	}
    
    	protected boolean shouldSkip(Class<?> beanClass, String beanName) {
    		return AutoProxyUtils.isOriginalInstance(beanName, beanClass);
    	}
    
              /*  Create an AOP proxy for the given bean.
               * Params:
               * beanClass – the class of the bean
               * beanName – the name of the bean
               * specificInterceptors – the set of interceptors that is specific to this bean (may be empty, but not null)
               * targetSource – the TargetSource for the proxy, already pre-configured to access the bean  TargetSource =  SingletonTargetSource
               * Returns:
               * the AOP proxy for the bean
               * See Also:
               */buildAdvisors
    	protected Object createProxy(Class<?> beanClass, @Nullable String beanName,
    			@Nullable Object[] specificInterceptors, TargetSource targetSource) {
    		//在Bean定义中设置代理类的原目标类属性值 org.springframework.aop.framework.autoproxy.AutoProxyUtils.originalTargetClass = target
    		if (this.beanFactory instanceof ConfigurableListableBeanFactory) {
    			AutoProxyUtils.exposeTargetClass((ConfigurableListableBeanFactory) this.beanFactory, beanName, beanClass);
    		}
      		//声明一个代理工厂,从当前对象拷贝配置 ,将统一配置拷贝到当前代理工厂 
    		ProxyFactory proxyFactory = new ProxyFactory();
    		proxyFactory.copyFrom(this);
      		//是否是代理目标类
    		if (proxyFactory.isProxyTargetClass()) {
    			// Explicit handling of JDK proxy targets (for introduction advice scenarios)
    			//是否是代理类
    			if (Proxy.isProxyClass(beanClass)) {
    				// Must allow for introductions; can't just set interfaces to the proxy's interfaces only.
    				for (Class<?> ifc : beanClass.getInterfaces()) {
    					proxyFactory.addInterface(ifc);
    				}
    			}
    		}
    		else {
    			// No proxyTargetClass flag enforced, let's apply our default checks...
    			if (shouldProxyTargetClass(beanClass, beanName)) {
    				proxyFactory.setProxyTargetClass(true);
    			}
    			else {
    				evaluateProxyInterfaces(beanClass, proxyFactory);
    			}
    		}
    
    		Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);
    		proxyFactory.addAdvisors(advisors);
    		proxyFactory.setTargetSource(targetSource);
    		customizeProxyFactory(proxyFactory);
    
    		proxyFactory.setFrozen(this.freezeProxy);
    		if (advisorsPreFiltered()) {
    			proxyFactory.setPreFiltered(true);
    		}
    
    		// Use original ClassLoader if bean class not locally loaded in overriding class loader
    		ClassLoader classLoader = getProxyClassLoader();
    		if (classLoader instanceof SmartClassLoader && classLoader != beanClass.getClassLoader()) {
    			classLoader = ((SmartClassLoader) classLoader).getOriginalClassLoader();
    		}
    		return proxyFactory.getProxy(classLoader);
    	}
    
    	//创建增强者
    	protected Advisor[] buildAdvisors(@Nullable String beanName, @Nullable Object[] specificInterceptors) {
    		// Handle prototypes correctly...正确处理原型类型
    		Advisor[] commonInterceptors = resolveInterceptorNames();
    
    		List<Object> allInterceptors = new ArrayList<>();
    		//specificInterceptors 有三个元素
    		if (specificInterceptors != null) {
    			if (specificInterceptors.length > 0) {
    				// specificInterceptors may equal PROXY_WITHOUT_ADDITIONAL_INTERCEPTORS
    				//添加指定元素
    				allInterceptors.addAll(Arrays.asList(specificInterceptors));
    			}
    			//添加普通元素
    			if (commonInterceptors.length > 0) {
    				if (this.applyCommonInterceptorsFirst) {
    					allInterceptors.addAll(0, Arrays.asList(commonInterceptors));
    				}
    				else {
    					allInterceptors.addAll(Arrays.asList(commonInterceptors));
    				}
    			}
    		}
    		if (logger.isTraceEnabled()) {
    			int nrOfCommonInterceptors = commonInterceptors.length;
    			int nrOfSpecificInterceptors = (specificInterceptors != null ? specificInterceptors.length : 0);
    			logger.trace("Creating implicit proxy for bean '" + beanName + "' with " + nrOfCommonInterceptors +
    					" common interceptors and " + nrOfSpecificInterceptors + " specific interceptors");
    		}
    		//通过增强适配注册器包装拦截器,包装成Advisor
    		Advisor[] advisors = new Advisor[allInterceptors.size()];
    		for (int i = 0; i < allInterceptors.size(); i++) {
    			advisors[i] = this.advisorAdapterRegistry.wrap(allInterceptors.get(i));
    		}
    		return advisors;
    	}
    
    	//此时this.interceptorNames为空
    	private Advisor[] resolveInterceptorNames() {
    		BeanFactory bf = this.beanFactory;
    		ConfigurableBeanFactory cbf = (bf instanceof ConfigurableBeanFactory ? (ConfigurableBeanFactory) bf : null);
    		List<Advisor> advisors = new ArrayList<>();
    		for (String beanName : this.interceptorNames) {
    			if (cbf == null || !cbf.isCurrentlyInCreation(beanName)) {
    				Assert.state(bf != null, "BeanFactory required for resolving interceptor names");
    				Object next = bf.getBean(beanName);
    				advisors.add(this.advisorAdapterRegistry.wrap(next));
    			}
    		}
    		return advisors.toArray(new Advisor[0]);
    	}
    
    }
    
    
    • AbstractAdvisorAutoProxyCreator
      首先调用getAdvicesAndAdvisorsForBean获取通知和增强类,随后调用findEligibleAdvisors查找符合条件的增强类,将获取到的增强对象传入方法,进行过滤。
      调用findAdvisorsThatCanApply,查找可以使用的增强吗,在findAdvisorsThatCanApply方法中,使用AOPUtils查找可以使用的增强,当前beanCbeanClass为UserServiceImpl类型,eligibleAdvisors = null;
      当beanCbeanClass为OrderServiceImpl的时候,eligibleAdvisors = before、after Advisor;extendAdvisors方法扩展了增强,添加了DefaultPointcutAdvisor默认切点增强。
    public abstract class AbstractAdvisorAutoProxyCreator extends AbstractAutoProxyCreator {
    
    	//帮助从BeanFactory中获取Spring Advisor
    	private BeanFactoryAdvisorRetrievalHelper advisorRetrievalHelper;
    
    	protected Object[] getAdvicesAndAdvisorsForBean(
    			Class<?> beanClass, String beanName, @Nullable TargetSource targetSource) {
    
    		List<Advisor> 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;
    	}
    
    	protected List<Advisor> findCandidateAdvisors() {
    		Assert.state(this.advisorRetrievalHelper != null, "No BeanFactoryAdvisorRetrievalHelper available");
    		return this.advisorRetrievalHelper.findAdvisorBeans();
    	}
    
            //查找可以使用的增强
    	protected List<Advisor> findAdvisorsThatCanApply(
    			List<Advisor> candidateAdvisors, Class<?> beanClass, String beanName) {
    
    		ProxyCreationContext.setCurrentProxiedBeanName(beanName);
    		try {
    			return AopUtils.findAdvisorsThatCanApply(candidateAdvisors, beanClass);
    		}
    		finally {
    			ProxyCreationContext.setCurrentProxiedBeanName(null);
    		}
    	}
    }
    
    

    ProxyCreationContext 中CurrentProxiedBeanName为ThreadlLocal类型

    • AnnotationAwareAspectJAutoProxyCreator
      根据父类规则,添加所有的Spring增强。为所有的Aspectj切面创建增强,返回coreAspectJ中的两个增强、before 、after,类型为InstantiationModelAwarePointcutAdvisorImpl
      如下:
    0 = {InstantiationModelAwarePointcutAdvisorImpl@7312} "InstantiationModelAwarePointcutAdvisor: expression [execution(* com.bail.analyse.springdemo.service.IOrderService.*(..))]; advice method [public void com.bail.analyse.springdemo.config.CoreAspectJ.before(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON"
    1 = {InstantiationModelAwarePointcutAdvisorImpl@7313} "InstantiationModelAwarePointcutAdvisor: expression [execution(* com.bail.analyse.springdemo.service.IOrderService.*(..))]; advice method [public void com.bail.analyse.springdemo.config.CoreAspectJ.after(org.aspectj.lang.JoinPoint)]; perClauseKind=SINGLETON"
    
    public class AnnotationAwareAspectJAutoProxyCreator extends AspectJAwareAdvisorAutoProxyCreator {
    
    	//Bean工厂切面增强构造器
    	@Nullable
    	private BeanFactoryAspectJAdvisorsBuilder aspectJAdvisorsBuilder;
    
    	@Override
    	protected List<Advisor> findCandidateAdvisors() {
    		// Add all the Spring advisors found according to superclass rules.
    		//根据父类规则,添加所有的Spring增强。
    		List<Advisor> advisors = super.findCandidateAdvisors();
    		// Build Advisors for all AspectJ aspects in the bean factory.
    		//为所有的Aspectj切面创建增强,返回coreAspectJ中的两个增强、before and after
    		if (this.aspectJAdvisorsBuilder != null) {
    			advisors.addAll(this.aspectJAdvisorsBuilder.buildAspectJAdvisors());
    		}
    		return advisors;
    	}
    
    }
    
    

    BeanFactoryAdvisorRetrievalHelper

    public class BeanFactoryAdvisorRetrievalHelper {
    
    	//符合带有@AspectJ的bean name,在第一次加载buildAspectJAdvisors的时候,进行对象填充
    	private volatile List<String> aspectBeanNames;
    
            //缓存增强列表
    	private final Map<String, List<Advisor>> advisorsCache = new ConcurrentHashMap<>();
    	//从BeanFactory中获取Spring Advisor,返回空数组
    	public List<Advisor> findAdvisorBeans() {
    		// Determine list of advisor bean names, if not cached already.
    		//此时的advisorNames  = coreAspectJ
    		String[] advisorNames = this.cachedAdvisorBeanNames;
    		if (advisorNames == null) {
    			// Do not initialize FactoryBeans here: We need to leave all regular beans
    			// uninitialized to let the auto-proxy creator apply to them!
    			advisorNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
    					this.beanFactory, Advisor.class, true, false);
    			this.cachedAdvisorBeanNames = advisorNames;
    		}
    		if (advisorNames.length == 0) {
    			//返回空数组
    			return new ArrayList<>();
    		}
    
    		List<Advisor> advisors = new ArrayList<>();
    		for (String name : advisorNames) {
    			if (isEligibleBean(name)) {
    				if (this.beanFactory.isCurrentlyInCreation(name)) {
    					if (logger.isTraceEnabled()) {
    						logger.trace("Skipping currently created advisor '" + name + "'");
    					}
    				}
    				else {
    					try {
    						advisors.add(this.beanFactory.getBean(name, Advisor.class));
    					}
    					catch (BeanCreationException ex) {
    						Throwable rootCause = ex.getMostSpecificCause();
    						if (rootCause instanceof BeanCurrentlyInCreationException) {
    							BeanCreationException bce = (BeanCreationException) rootCause;
    							String bceBeanName = bce.getBeanName();
    							if (bceBeanName != null && this.beanFactory.isCurrentlyInCreation(bceBeanName)) {
    								if (logger.isTraceEnabled()) {
    									logger.trace("Skipping advisor '" + name +
    											"' with dependency on currently created bean: " + ex.getMessage());
    								}
    								// Ignore: indicates a reference back to the bean we're trying to advise.
    								// We want to find advisors other than the currently created bean itself.
    								continue;
    							}
    						}
    						throw ex;
    					}
    				}
    			}
    		}
    		return advisors;
    	}
    	
    	//创建Aspectj类型的增强
    	public List<Advisor> buildAspectJAdvisors() {
    		List<String> aspectNames = this.aspectBeanNames;
    
    		if (aspectNames == null) {
    			synchronized (this) {
    				aspectNames = this.aspectBeanNames;
    				if (aspectNames == null) {
    					List<Advisor> advisors = new ArrayList<>();
    					aspectNames = new ArrayList<>();
    					String[] beanNames = BeanFactoryUtils.beanNamesForTypeIncludingAncestors(
    							this.beanFactory, Object.class, true, false);
    					for (String beanName : beanNames) {
    						if (!isEligibleBean(beanName)) {
    							continue;
    						}
    						// We must be careful not to instantiate beans eagerly as in this case they
    						// would be cached by the Spring container but would not have been weaved.
    						Class<?> beanType = this.beanFactory.getType(beanName, false);
    						if (beanType == null) {
    							continue;
    						}
    						if (this.advisorFactory.isAspect(beanType)) {
    							aspectNames.add(beanName);
    							AspectMetadata amd = new AspectMetadata(beanType, beanName);
    							if (amd.getAjType().getPerClause().getKind() == PerClauseKind.SINGLETON) {
    								MetadataAwareAspectInstanceFactory factory =
    										new BeanFactoryAspectInstanceFactory(this.beanFactory, beanName);
    								List<Advisor> classAdvisors = this.advisorFactory.getAdvisors(factory);
    								if (this.beanFactory.isSingleton(beanName)) {
    									this.advisorsCache.put(beanName, classAdvisors);
    								}
    								else {
    									this.aspectFactoryCache.put(beanName, factory);
    								}
    								advisors.addAll(classAdvisors);
    							}
    							else {
    								// Per target or per this.
    								if (this.beanFactory.isSingleton(beanName)) {
    									throw new IllegalArgumentException("Bean with name '" + beanName +
    											"' is a singleton, but aspect instantiation model is not singleton");
    								}
    								MetadataAwareAspectInstanceFactory factory =
    										new PrototypeAspectInstanceFactory(this.beanFactory, beanName);
    								this.aspectFactoryCache.put(beanName, factory);
    								advisors.addAll(this.advisorFactory.getAdvisors(factory));
    							}
    						}
    					}
    					this.aspectBeanNames = aspectNames;
    					return advisors;
    				}
    			}
    		}
    
    		if (aspectNames.isEmpty()) {
    			return Collections.emptyList();
    		}
    		List<Advisor> advisors = new ArrayList<>();
                    //根据切面名称从增强缓存中获取增强列表
    		for (String aspectName : aspectNames) {
    			List<Advisor> cachedAdvisors = this.advisorsCache.get(aspectName);
    			if (cachedAdvisors != null) {
    				advisors.addAll(cachedAdvisors);
    			}
    			else {
    				MetadataAwareAspectInstanceFactory factory = this.aspectFactoryCache.get(aspectName);
    				advisors.addAll(this.advisorFactory.getAdvisors(factory));
    			}
    		}
    		return advisors;
    	}
    
    
    }
    

    AopUtils

    判断增强点是不是引介增强,如果不是判断是不是切点增强,此处我们是以切点增强为例,所以我们进入else if,强转成PointcutAdvisor ,调用canApply方法,

    public abstract class AopUtils {
    	public static List<Advisor> findAdvisorsThatCanApply(List<Advisor> candidateAdvisors, Class<?> clazz) {
    		if (candidateAdvisors.isEmpty()) {
    			return candidateAdvisors;
    		}
    		List<Advisor> eligibleAdvisors = new ArrayList<>();
    		for (Advisor candidate : candidateAdvisors) {
    			if (candidate instanceof IntroductionAdvisor && canApply(candidate, clazz)) {
    				eligibleAdvisors.add(candidate);
    			}
    		}
    		boolean hasIntroductions = !eligibleAdvisors.isEmpty();
    		for (Advisor candidate : candidateAdvisors) {
    			if (candidate instanceof IntroductionAdvisor) {
    				// already processed
    				continue;
    			}
    			if (canApply(candidate, clazz, hasIntroductions)) {
    				eligibleAdvisors.add(candidate);
    			}
    		}
    		return eligibleAdvisors;
    	}
    
    	public static boolean canApply(Advisor advisor, Class<?> targetClass, boolean hasIntroductions) {
    		if (advisor instanceof IntroductionAdvisor) {
    			return ((IntroductionAdvisor) advisor).getClassFilter().matches(targetClass);
    		}
    		else if (advisor instanceof PointcutAdvisor) {
    			PointcutAdvisor pca = (PointcutAdvisor) advisor;
    			return canApply(pca.getPointcut(), targetClass, hasIntroductions);
    		}
    		else {
    			// It doesn't have a pointcut so we assume it applies.
    			return true;
    		}
    	}
    	/**
    	*判断当前增强是否满足当前类,首先判断类类型是否满足
    	*
    	*/
    	public static boolean canApply(Pointcut pc, Class<?> targetClass, boolean hasIntroductions) {
    		Assert.notNull(pc, "Pointcut must not be null");
    		if (!pc.getClassFilter().matches(targetClass)) {
    			return false;
    		}
    
    		MethodMatcher methodMatcher = pc.getMethodMatcher();
    		if (methodMatcher == MethodMatcher.TRUE) {
    			// No need to iterate the methods if we're matching any method anyway...
    			return true;
    		}
    
    		IntroductionAwareMethodMatcher introductionAwareMethodMatcher = null;
    		if (methodMatcher instanceof IntroductionAwareMethodMatcher) {
    			introductionAwareMethodMatcher = (IntroductionAwareMethodMatcher) methodMatcher;
    		}
    
    		Set<Class<?>> classes = new LinkedHashSet<>();
    		if (!Proxy.isProxyClass(targetClass)) {
    			classes.add(ClassUtils.getUserClass(targetClass));
    		}
    		classes.addAll(ClassUtils.getAllInterfacesForClassAsSet(targetClass));
    
    		for (Class<?> clazz : classes) {
    			Method[] methods = ReflectionUtils.getAllDeclaredMethods(clazz);
    			for (Method method : methods) {
    				if (introductionAwareMethodMatcher != null ?
    						introductionAwareMethodMatcher.matches(method, targetClass, hasIntroductions) :
    						methodMatcher.matches(method, targetClass)) {
    					return true;
    				}
    			}
    		}
    
    		return false;
    	}
    }
    

    AutoProxyUtils

    判断是否是原始类
    暴露目标类,调用beanFactory的getMergedBeanDefinition方法。合并bean定义。得到合并BeanDefinition之后,设置属性org.springframework.aop.framework.autoproxy.AutoProxyUtils.originalTargetClass = target

    public abstract class AutoProxyUtils {
    	static boolean isOriginalInstance(String beanName, Class<?> beanClass) {
    		if (!StringUtils.hasLength(beanName) || beanName.length() !=
    				beanClass.getName().length() + AutowireCapableBeanFactory.ORIGINAL_INSTANCE_SUFFIX.length()) {
    			return false;
    		}
    		return (beanName.startsWith(beanClass.getName()) &&
    				beanName.endsWith(AutowireCapableBeanFactory.ORIGINAL_INSTANCE_SUFFIX));
    	}
    
    	static void exposeTargetClass(
    			ConfigurableListableBeanFactory beanFactory, @Nullable String beanName, Class<?> targetClass) {
    
    		if (beanName != null && beanFactory.containsBeanDefinition(beanName)) {
    			//合并Bean定义,调用beanFactory的getMergedBeanDefinition方法。合并bean定义
    			beanFactory.getMergedBeanDefinition(beanName).setAttribute(ORIGINAL_TARGET_CLASS_ATTRIBUTE, targetClass);
    		}
    	}
    }
    

    *AbstractBeanFactory
    调用完getMergedBeanDefinition,执行getMergedLocalBeanDefinition方法。
    首先从合并Bean定义缓存中获取RootBeanDefinition ,如果RootBeanDefinition 不为空,直接返回,否则调用方法进行合并。此时不为空,直接返回

    public abstract class AbstractBeanFactory extends FactoryBeanRegistrySupport implements ConfigurableBeanFactory {
    	private final Map<String, RootBeanDefinition> mergedBeanDefinitions = new ConcurrentHashMap<>(256);
    	@Override
    	public BeanDefinition getMergedBeanDefinition(String name) throws BeansException {
    		String beanName = transformedBeanName(name);
    		// Efficiently check whether bean definition exists in this factory.
    		if (!containsBeanDefinition(beanName) && getParentBeanFactory() instanceof ConfigurableBeanFactory) {
    			return ((ConfigurableBeanFactory) getParentBeanFactory()).getMergedBeanDefinition(beanName);
    		}
    		// Resolve merged bean definition locally.
    		return getMergedLocalBeanDefinition(beanName);
    	}
    	protected RootBeanDefinition getMergedLocalBeanDefinition(String beanName) throws BeansException {
    		// Quick check on the concurrent map first, with minimal locking.
    		RootBeanDefinition mbd = this.mergedBeanDefinitions.get(beanName);
    		if (mbd != null && !mbd.stale) {
    			return mbd;
    		}
    		return getMergedBeanDefinition(beanName, getBeanDefinition(beanName));
    	}
    }
    

    DefaultAdvisorAdapterRegistry

    调用wrap方法转换Inteceptor,如果是Advisor类型,直接返回,如果是MethodInterceptor,包装成DefaultPointcutAdvisor返回;如果是AdvisorAdapter,包装成DefaultPointcutAdvisor返回;
    其中adapters :

    0 = {MethodBeforeAdviceAdapter@6895} 
    1 = {AfterReturningAdviceAdapter@6896} 
    2 = {ThrowsAdviceAdapter@6897} 
    

    包装之后,返回createProxy

    public class DefaultAdvisorAdapterRegistry implements AdvisorAdapterRegistry, Serializable {
    	private final List<AdvisorAdapter> adapters = new ArrayList<>(3);
    
    	public Advisor wrap(Object adviceObject) throws UnknownAdviceTypeException {
    		if (adviceObject instanceof Advisor) {
    			return (Advisor) adviceObject;
    		}
    		if (!(adviceObject instanceof Advice)) {
    			throw new UnknownAdviceTypeException(adviceObject);
    		}
    		Advice advice = (Advice) adviceObject;
    		if (advice instanceof MethodInterceptor) {
    			// So well-known it doesn't even need an adapter.
    			return new DefaultPointcutAdvisor(advice);
    		}
    		for (AdvisorAdapter adapter : this.adapters) {
    			// Check that it is supported.
    			if (adapter.supportsAdvice(advice)) {
    				return new DefaultPointcutAdvisor(advice);
    			}
    		}
    		throw new UnknownAdviceTypeException(advice);
    	}
    }
    

    ProxyFactory

    调用父类ProxyCreatorSupport 的createAopProxy()返回一个AopProxy,然后调用CglibAopProxy的getProxy方法返回一个目标类的代理对象。

    public class ProxyFactory extends ProxyCreatorSupport {
    	public Object getProxy(@Nullable ClassLoader classLoader) {
    		return createAopProxy().getProxy(classLoader);
    	}
    }
    
    

    ProxyCreatorSupport

    createAopProxy方法中激活代理工厂,getAopProxyFactory()返回成员变量aopProxyFactory,并创建代理类

    public class ProxyCreatorSupport extends AdvisedSupport {
    
    	private AopProxyFactory aopProxyFactory;
            //设置为true第一次创建AOP proxy的时候
    	private boolean active = false;
    	protected final synchronized AopProxy createAopProxy() {
    		if (!this.active) {
    			activate();
    		}
    		return getAopProxyFactory().createAopProxy(this);
    	}
    
    	private void activate() {
    		this.active = true;
    		for (AdvisedSupportListener listener : this.listeners) {
    			listener.activated(this);
    		}
    	}
    }
    
    • AdvisedSupport
      getConfigurationOnlyCopy方法在CglibAopProxy中调用,用来获取配置信息
    public class AdvisedSupport extends ProxyConfig implements Advised {
    	AdvisedSupport getConfigurationOnlyCopy() {
    		AdvisedSupport copy = new AdvisedSupport();
    		copy.copyFrom(this);
    		copy.targetSource = EmptyTargetSource.forClass(getTargetClass(), getTargetSource().isStatic());
    		copy.advisorChainFactory = this.advisorChainFactory;
    		copy.interfaces = new ArrayList<>(this.interfaces);
    		copy.advisors = new ArrayList<>(this.advisors);
    		return copy;
    	}
    }
    

    DefaultAopProxyFactory

    根据ProxyFactory的config生成代理类

    public class DefaultAopProxyFactory implements AopProxyFactory, Serializable {
    	public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
    		if (!NativeDetector.inNativeImage() &&
    				(config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config))) {
    			Class<?> targetClass = config.getTargetClass();
    			if (targetClass == null) {
    				throw new AopConfigException("TargetSource cannot determine target class: " +
    						"Either an interface or a target is required for proxy creation.");
    			}
    			if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
    				return new JdkDynamicAopProxy(config);
    			}
    			return new ObjenesisCglibAopProxy(config);
    		}
    		else {
    			return new JdkDynamicAopProxy(config);
    		}
    	}
    }
    
    

    CglibAopProxy

    • ObjenesisCglibAopProxy
      ObjenesisCglibAopProxy 的createProxyClassAndInstance方法创建代理实例并返回的AbstractAutoProxyCreator的wrapIfNecessary方法处
    class ObjenesisCglibAopProxy extends CglibAopProxy {
    	public ObjenesisCglibAopProxy(AdvisedSupport config) {
    		super(config);
    	}
    
    	protected Object createProxyClassAndInstance(Enhancer enhancer, Callback[] callbacks) {
    		Class<?> proxyClass = enhancer.createClass();
    		Object proxyInstance = null;
    
    		if (objenesis.isWorthTrying()) {
    			try {
    				proxyInstance = objenesis.newInstance(proxyClass, enhancer.getUseCache());
    			}
    			catch (Throwable ex) {
    				logger.debug("Unable to instantiate proxy using Objenesis, " +
    						"falling back to regular proxy construction", ex);
    			}
    		}
    
    		if (proxyInstance == null) {
    			// Regular instantiation via default constructor...
    			try {
    				Constructor<?> ctor = (this.constructorArgs != null ?
    						proxyClass.getDeclaredConstructor(this.constructorArgTypes) :
    						proxyClass.getDeclaredConstructor());
    				ReflectionUtils.makeAccessible(ctor);
    				proxyInstance = (this.constructorArgs != null ?
    						ctor.newInstance(this.constructorArgs) : ctor.newInstance());
    			}
    			catch (Throwable ex) {
    				throw new AopConfigException("Unable to instantiate proxy using Objenesis, " +
    						"and regular proxy instantiation via default constructor fails as well", ex);
    			}
    		}
    
    		((Factory) proxyInstance).setCallbacks(callbacks);
    		return proxyInstance;
    	}
    }
    
    • CglibAopProxy
      构造方法
      内部类
      getProxy方法,用来生成目标类代理对象,方法中this.advised.getConfigurationOnlyCopy()用来获取config信息:如advisor等信息。最后调用子类的createProxyClassAndInstance方法创建代理对象实例
    class CglibAopProxy implements AopProxy, Serializable {
    	public CglibAopProxy(AdvisedSupport config) throws AopConfigException {
    		Assert.notNull(config, "AdvisedSupport must not be null");
    		if (config.getAdvisorCount() == 0 && config.getTargetSource() == AdvisedSupport.EMPTY_TARGET_SOURCE) {
    			throw new AopConfigException("No advisors and no TargetSource specified");
    		}
    		this.advised = config;
    		this.advisedDispatcher = new AdvisedDispatcher(this.advised);
    	}
    
    	public Object getProxy(@Nullable ClassLoader classLoader) {
    		if (logger.isTraceEnabled()) {
    			logger.trace("Creating CGLIB proxy: " + this.advised.getTargetSource());
    		}
    
    		try {
    			Class<?> rootClass = this.advised.getTargetClass();
    			Assert.state(rootClass != null, "Target class must be available for creating a CGLIB proxy");
    
    			Class<?> proxySuperClass = rootClass;
    			if (rootClass.getName().contains(ClassUtils.CGLIB_CLASS_SEPARATOR)) {
    				proxySuperClass = rootClass.getSuperclass();
    				Class<?>[] additionalInterfaces = rootClass.getInterfaces();
    				for (Class<?> additionalInterface : additionalInterfaces) {
    					this.advised.addInterface(additionalInterface);
    				}
    			}
    
    			// Validate the class, writing log messages as necessary.
    			validateClassIfNecessary(proxySuperClass, classLoader);
    
    			// Configure CGLIB Enhancer...
    			Enhancer enhancer = createEnhancer();
    			if (classLoader != null) {
    				enhancer.setClassLoader(classLoader);
    				if (classLoader instanceof SmartClassLoader &&
    						((SmartClassLoader) classLoader).isClassReloadable(proxySuperClass)) {
    					enhancer.setUseCache(false);
    				}
    			}
    			enhancer.setSuperclass(proxySuperClass);
    			enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));
    			enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
    			enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(classLoader));
    
    			Callback[] callbacks = getCallbacks(rootClass);
    			Class<?>[] types = new Class<?>[callbacks.length];
    			for (int x = 0; x < types.length; x++) {
    				types[x] = callbacks[x].getClass();
    			}
    			// fixedInterceptorMap only populated at this point, after getCallbacks call above
    			enhancer.setCallbackFilter(new ProxyCallbackFilter(
    					this.advised.getConfigurationOnlyCopy(), this.fixedInterceptorMap, this.fixedInterceptorOffset));
    			enhancer.setCallbackTypes(types);
    
    			// Generate the proxy class and create a proxy instance.
    			return createProxyClassAndInstance(enhancer, callbacks);
    		}
    		catch (CodeGenerationException | IllegalArgumentException ex) {
    			throw new AopConfigException("Could not generate CGLIB subclass of " + this.advised.getTargetClass() +
    					": Common causes of this problem include using a final class or a non-visible class",
    					ex);
    		}
    		catch (Throwable ex) {
    			// TargetSource.getTarget() failed
    			throw new AopConfigException("Unexpected AOP exception", ex);
    		}
    	}
    
    	//派发声明在通知类上的任何方法
    	private static class AdvisedDispatcher implements Dispatcher, Serializable {
    
    		private final AdvisedSupport advised;
    
    		public AdvisedDispatcher(AdvisedSupport advised) {
    			this.advised = advised;
    		}
    
    		@Override
    		public Object loadObject() {
    			return this.advised;
    		}
    	}
    }
    
  • 相关阅读:
    《人件》读书笔记3
    《人件》读书笔记2
    《人件》读书笔记1
    《编程珠玑》读书笔记3
    《编程珠玑》读书笔记2
    学习进度报告2021/4/10
    《编程珠玑》读书笔记1
    学习进度报告2021/4/9
    学习进度报告2021/4/8
    关于软件体系架构质量属性的科技小论文
  • 原文地址:https://www.cnblogs.com/nangonghui/p/15649698.html
Copyright © 2011-2022 走看看