org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator
该类中做了对目标类的代理处理。
public abstract class AbstractAutoProxyCreator extends ProxyProcessorSupport
implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
继承ProxyProcessorSupport类
实现了SmartInstantiationAwareBeanPostProcessor接口,这里面有很多和bean实例化的生命周期相关的方法。
实现了BeanFactoryAware接口,设置BeanFactory的。
方法
由于有很多方法,对应不同的处理逻辑,暂时不分析其他的功能,只对自动代理的部分进行介绍
自动代理发生的地方是:postProcessAfterInitialization方法。在初始化完成之后
@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;
}
// 如果不需要代理,直接返回这个bean
if (Boolean.FALSE.equals(this.advisedBeans.get(cacheKey))) {
return bean;
}
// 如果这个类是底层结构的类型,Advice,Pointcut,Advisor,AopInfrastructureBean
// 这些代理的类是不能再次代理的
// beanname是以ORIGINAL结尾的,或者@aspect注解标注的都需要跳过。
if (isInfrastructureClass(bean.getClass()) || shouldSkip(bean.getClass(), beanName)) {
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
// 找到和这个类匹配的切面,虽然返回的是Object类型,但确定是切面类型
// 这个是子类实现的。
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;
}
// 如果没有拦截器的信息,返回的是bean实例
this.advisedBeans.put(cacheKey, Boolean.FALSE);
return bean;
}
查看bean是否是不能被代理的,如果不符合条件,返回的是bean实例
如果可以代理,查看是否有针对这个类的拦截器,如果有,创建代理。没有的话返回bean实例
下面看下是如何创建代理的
org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator#createProxy
protected Object createProxy(Class<?