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
判断一个类是否需要代理:
- 排除掉TargetSource类型的bean。
- 排除掉AOP相关的基础设施类:Advice、PointCut、Advisor、AopInfrastructureBean。
- 自定义是否需要跳过代理处理。
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。