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;
    		}
    	}
    }
    
  • 相关阅读:
    HDU1029 Ignatius and the Princess IV
    UVA11039 Building designing【排序】
    UVA11039 Building designing【排序】
    POJ3278 HDU2717 Catch That Cow
    POJ3278 HDU2717 Catch That Cow
    POJ1338 Ugly Numbers(解法二)
    POJ1338 Ugly Numbers(解法二)
    UVA532 Dungeon Master
    UVA532 Dungeon Master
    POJ1915 Knight Moves
  • 原文地址:https://www.cnblogs.com/nangonghui/p/15649698.html
Copyright © 2011-2022 走看看