SpringBoot中AbstractAutoProxyCreator类解析

 AbstractAutoProxyCreator如类名所示其核心功能是为代理。作为BeanPostProcessor接口的实现类实现了利用 AOP 代理包装每个符合条件的 bean,在调用 bean 本身之前委托给指定的拦截器。

此类区分“通用”拦截器:为其创建的所有代理共享,以及“特定”拦截器:每个 bean 实例唯一。

不需要有任何通用拦截器。如果有,则使用 InterceptorNames 属性来设置它们。

与ProxyFactoryBean一样,使用当前工厂中的拦截器名称而不是 bean 引用,来正确处理 prototype【原型】 advisors and interceptors:例如,支持有状态 mixin。 任何类型的通知advice都是支持{@link #setInterceptorNames "interceptorNames"} entries。

如果有大量的bean 需要用类似的代理包装,即委托给相同的拦截器,那么这种自动代理特别有用。 您可以向 bean 工厂注册 一个这样的后置理器来实现相同的效果,而不是为 x 个目标 bean 进行 x 个重复的代理定义。

子类可以应用任何策略来决定是否要代理 bean,例如按类型、按名称、按定义详细信息等。它们还可以返回额外的拦截器, 不过仅限应用于特定的 bean 实例。一个简单的具体实现是 BeanNameAutoProxyCreator,通过名称指定要代理的 bean。

Any number of TargetSourceCreator implementations can be used to create a custom target source: for example, to pool prototype objects。只要 TargetSourceCreator 指定一个自定义的TargetSource,即使没有advice,自动代理也会发生。如果没有设置 TargetSourceCreators,或者没有匹配,则默认情况下将使用SingletonTargetSource 来包装目标 bean 实例。


1.BeanPostProcessor

public interface BeanPostProcessor {

	default Object postProcessBeforeInitialization(Object bean, String beanName) {return bean;}

	default Object postProcessAfterInitialization(Object bean, String beanName) {return bean;}
}

2.InstantiationAwareBeanPostProcessor

public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor {
	default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName){return null;}
	default boolean postProcessAfterInstantiation(Object bean, String beanName) {return true;}
	//类之间通过注解@Autowired引入的依赖
	default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {return null;}
}

3.SmartInstantiationAwareBeanPostProcessor

public interface SmartInstantiationAwareBeanPostProcessor extends InstantiationAwareBeanPostProcessor {
	default Class<?> predictBeanType(Class<?> beanClass, String beanName) {return null;}
	default Constructor<?>[] determineCandidateConstructors(Class<?> beanClass, String beanName) {return null;}
	// 类的过早暴露,此时类的终极形态为代理类
	default Object getEarlyBeanReference(Object bean, String beanName){return bean;}
}

4.接口方法执行时机

4.1.BeforeInstantiation & AfterInitialization

public abstract class AbstractAutowireCapableBeanFactory{

	protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args){
		...
		// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
		Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
		return doCreateBean(beanName, mbdToUse, args);
	}

	protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
		Object bean = null;
		if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
			if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
				Class<?> targetType = determineTargetType(beanName, mbd);
				if (targetType != null) {
					bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
					if (bean != null) {
						bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
					}
				}
			}
			mbd.beforeInstantiationResolved = (bean != null);
		}
		return bean;
	}

}

4.2.determineCandidateConstructors

public abstract class AbstractAutowireCapableBeanFactory{

	protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) {
		...	
		// Candidate constructors for autowiring?
		Constructor<?>[] ctors = determineConstructorsFromBeanPostProcessors(beanClass, beanName);
		...
		return instantiateBean(beanName, mbd);
	}

}

参考AutowiredAnnotationBeanPostProcessor解析@Autowired注解。当然在AOP代理或者事务方面无需该核心方法。


4.3.AfterInstantiation & postProcessProperties

public abstract class AbstractAutowireCapableBeanFactory{

	protected void populateBean(String beanName, RootBeanDefinition mbd, @Nullable BeanWrapper bw) {
		...
		if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
			for (BeanPostProcessor bp : getBeanPostProcessors()) {
				if (bp instanceof InstantiationAwareBeanPostProcessor) {
					InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
					if (!ibp.postProcessAfterInstantiation(bw.getWrappedInstance(), beanName)) {
						return;
					}
				}
			}
		}
		...
		for (BeanPostProcessor bp : getBeanPostProcessors()) {
			if (bp instanceof InstantiationAwareBeanPostProcessor) {
				InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
				PropertyValues pvsToUse = ibp.postProcessProperties(pvs, bw.getWrappedInstance(), beanName);
				...
				pvs = pvsToUse;
			}
		}
		...
	}

}

4.4.BeforeInitialization & AfterInitialization

public abstract class AbstractAutowireCapableBeanFactory{

	protected Object initializeBean(String beanName, Object bean, @Nullable RootBeanDefinition mbd) {
		...
		invokeAwareMethods(beanName, bean);
		Object wrappedBean = bean;
		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
		}
		invokeInitMethods(beanName, wrappedBean, mbd);
		if (mbd == null || !mbd.isSynthetic()) {
			wrappedBean = applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
		}
		return wrappedBean;
	}

}

5.AbstractAutoProxyCreator

判断一个类是否需要代理:

  1. 排除掉TargetSource类型的bean。
  2. 排除掉AOP相关的基础设施类:Advice、PointCut、Advisor、AopInfrastructureBean。
  3. 自定义是否需要跳过代理处理。
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
		implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware {
    // 如果存在循环引用,则提前创建bean的代理类
	@Override
	public Object getEarlyBeanReference(Object bean, String beanName) {
		Object cacheKey = getCacheKey(bean.getClass(), beanName);
		this.earlyProxyReferences.put(cacheKey, bean);
		return wrapIfNecessary(bean, beanName, cacheKey);
	}

	@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.
		// Suppresses unnecessary default instantiation of the target bean:
		// The TargetSource will handle target instances in a custom fashion.
		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;
	}

	@Override
	public boolean postProcessAfterInstantiation(Object bean, String beanName) {
		return true;
	}

	@Override
	public PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) {
		return pvs;
	}

	@Override
	public Object postProcessBeforeInitialization(Object bean, String beanName) {
		return bean;
	}

	// 通常情况触发bean的代理流程
	@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) {
		if (StringUtils.hasLength(beanName) && this.targetSourcedBeans.contains(beanName)) {
			return bean;
		}
		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) {
			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 Object createProxy(Class<?> beanClass, @Nullable String beanName,
			@Nullable Object[] specificInterceptors, TargetSource targetSource) {

		ProxyFactory proxyFactory = new ProxyFactory();
		proxyFactory.copyFrom(this);
		...
		Advisor[] advisors = buildAdvisors(beanName, specificInterceptors);
		proxyFactory.addAdvisors(advisors);
		proxyFactory.setTargetSource(targetSource);
		customizeProxyFactory(proxyFactory);

		proxyFactory.setFrozen(this.freezeProxy);
		if (advisorsPreFiltered()) {
			proxyFactory.setPreFiltered(true);
		}

		return proxyFactory.getProxy(getProxyClassLoader());
	}

	
	protected Advisor[] buildAdvisors(@Nullable String beanName, @Nullable Object[] specificInterceptors) {
		// Handle prototypes correctly...
		Advisor[] commonInterceptors = resolveInterceptorNames();

		List<Object> allInterceptors = new ArrayList<>();
		if (specificInterceptors != null) {
			allInterceptors.addAll(Arrays.asList(specificInterceptors));
			if (commonInterceptors.length > 0) {
				if (this.applyCommonInterceptorsFirst) {
					allInterceptors.addAll(0, Arrays.asList(commonInterceptors));
				}
				else {
					allInterceptors.addAll(Arrays.asList(commonInterceptors));
				}
			}
		}

		Advisor[] advisors = new Advisor[allInterceptors.size()];
		for (int i = 0; i < allInterceptors.size(); i++) {
			advisors[i] = this.advisorAdapterRegistry.wrap(allInterceptors.get(i));
		}
		return advisors;
	}

}

当然当前类为抽象类,必须由其子类触发抽象类的功能。例如如果存在aop相关的jar包就会引入类AnnotationAwareAspectJAutoProxyCreator,该类作为后置处理器判断ioc容器中每一个bean。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值